PMD 和 FindBugs 有啥区别?

Posted

技术标签:

【中文标题】PMD 和 FindBugs 有啥区别?【英文标题】:What are the differences between PMD and FindBugs?PMD 和 FindBugs 有什么区别? 【发布时间】:2011-05-16 20:52:59 【问题描述】:

有一个question comparing PMD and CheckStyle。但是,我找不到关于 PMD 和 FindBugs 之间差异/相似性的详细分类。我相信一个关键的区别是 PMD 处理源代码,而 FindBugs 处理编译的字节码文件。但就能力而言,它应该是一个非此即彼的选择还是相辅相成?

【问题讨论】:

【参考方案1】:

PMD 是

著名 广泛应用于工业 您可以在 xml 中添加规则 为您提供错误级别和警告级别的详细分析 您还可以扫描您的代码以获取“复制和粘贴行”。重复代码。这为实现 java oops 提供了一个好主意。

【讨论】:

不与 FindBugs 对话;它们是互补的,因为它们的问题集并不相同。【参考方案2】:

PMD 的最佳特性是它的 XPath 规则,它与规则设计器捆绑在一起,让您可以轻松地从代码示例构建新规则(类似于 RegEx 和 XPath GUI 构建器)。 FindBugs 开箱即用更强大,但构建项目特定的规则和模式非常重要。

例如,我遇到了一个涉及 2 个嵌套 for 循环的性能问题,导致运行时间为 O(n^2),这很容易避免。我使用 PMD 构造了一个 ad-hoc 查询,以查看嵌套 for 循环的其他实例 - //ForStatement/Statement//ForStatement。这指出了该问题的另外 2 个实例。这不是一个通用规则。

【讨论】:

【参考方案3】:

我两个都用。我认为它们是相辅相成的。

正如您所说,PMD 处理源代码,因此会发现以下问题:违反命名约定、缺少花括号、空检查错误、参数列表过长、不必要的构造函数、开关中缺少中断等。PMD 也告诉你代码的Cyclomatic complexity 我觉得很有帮助(FindBugs 没有告诉你循环复杂度)。

FindBugs 作用于字节码。以下是 FindBugs 发现的 PMD 没有发现的一些问题:equals() 方法在子类型上失败,clone 方法可能返回 null,布尔值的参考比较,不可能的强制转换,32 位 int 移位的量不在 0-31 范围内,包含自身的集合,equals 方法总是返回 true,无限循环等。

通常他们每个人都会发现一组不同的问题。两者都用。这些工具教会了我很多关于如何编写好的 Java 代码的知识。

【讨论】:

当集合包含自身时,您看到的具体错误代码是什么?为什么这会被 FindBugs 标记为可能的错误? 好吧,因为 Sonarqube 6.3 不再... Sonarqube 现在需要 Java 8 而 Findbugs 只支持 Java 7

以上是关于PMD 和 FindBugs 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Sonar 导出 FindBugs/PMD/Checkstyle 规则并导入 Netbeans

有没有办法忽略单个 FindBugs 警告?

Checkstyle 与 PMD

检查结果

eclipse里的findbugs单击没反应

findbugsPMDCheckstyle等CI插件的使用