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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章