我熟悉一些可用于 Java 的免费静态分析工具,例如 FindBugs 和 PMD。我想知道的是 Klocwork 和 Coverity 等商业产品如何与这些产品相抗衡。他们的优势和劣势是什么?
5 回答
我们使用一套开源和商业静态分析工具。不同的工具会发现不同类型的错误,其中一些针对较低的误报率进行了调整,但可能会遗漏一些真正的问题。
根据我的经验,Findbugs 在发现真正的问题方面做得很好,尤其是当你按照他们的团队建议关注正确性错误时。最近 Findbugs 的开发人员也添加了一些基本的安全漏洞检查。Coverity 的误报率很低,尤其是在您不打开他们的实验检查器的情况下,Coverity Prevent 包含一个用于趋势/集群分析的良好跟踪数据库。我还不相信他们的线程检查器(静态或动态)工作 - 至少他们没有发现任何对我们感兴趣的东西。Klocwork Developer for Java 返回更高的误报率,但我们发现它们具有这些工具中最强的安全检查。因此,这取决于您的优先级是质量检查(Findbugs、Coverity)还是安全漏洞分析(Klocwork 或 Fortify)。
最近与 NIST 进行的一个名为“SATE:静态分析工具展示”的项目审查了各种不同的工具及其基本方法。 https://samate.nist.gov/index.php/SATE.html 以及其他对该项目的引用,例如 OWASP。一般的发现是,不同的工具有不同的优势和劣势,所以如果你想彻底完成工作,可以使用多个。
我建议您尝试使用开源软件质量管理工具SONAR ,该工具致力于持续分析和测量源代码质量。该软件从代码分析工具中获取结果,整合结果并让您访问用户友好的界面。
您肯定会在商业静态分析工具中找到的一个功能(至少在 2008 年,在 OP 时代,您不会在免费软件分析工具中轻易找到)是报告:随着时间的推移
测量软件质量趋势
正如这个关于代码度量的问题所解释的那样,任何静态代码分析本身并不总是有意义的,因为您可以:
- 太多“缺陷”无法修复
- 报告的缺陷类别过多
您需要能够进行一些分类,并且您需要检查特定缺陷是否随着时间的推移越来越少地发生,以帮助您确定要修复的优先级。
对于具有数千个类的遗留项目尤其如此:您不会像这样在没有充分理由的情况下修复许多文件的缺陷。这个原因可以从免费软件工具所找不到的良好报告和趋势分析中推断出来。
更新:从 2012 年(4 年后)开始,Sonar(现在在 2018 年命名为“ SonarQube ” )在其 4.x 和 5.x 系列中的“历史信息”(又名“时间机器”)。请注意,SonarQube 6.1(2016 年 9 月)中删除了
这些项目仪表板:请参阅此线程。
这些仪表板需要通过自定义页面手动重新创建。SonarQube 6.5使用活动页面恢复了一些仪表板,该页面获取(几个预定义的和一个可自定义的)图表来显示项目的演变。
我没有使用 Findbugs 或 PMD 的直接经验,但遇到很多人将它们与 Klocwork 和 Coverity 进行比较。
我对反馈的一般看法是:
Findbugs 和 PMD 更“工具化”。您将在桌面上运行的东西的类型。它发现了广泛的潜在问题,但往往是嘈杂的,这意味着误报和“我不在乎”的品种。它确实找到了一些好东西。我听到关于其长期使用的不同反馈。有些人认为免费工具的投资回报率是无限的,但是误报确实要付出代价。
毫不奇怪,花钱的 Klocwork 和 Coverity 往往更面向解决方案,也可以更好地扩展以与团队合作,拥有更高效、更易于使用的 UI,而且噪音更小。似乎他们的分析正在进行更深入的检查,因此如果您进行并排比较,则会得出更好的结果。在整个团队中采用工具时,您会对使用工具产生不同程度的热情,而噪音因素是阻碍广泛采用的一个大问题。当然还有一些事情,比如有支持来支持你,等等。
一般来说,由于 Findbugs 和 PMD 是免费的,因此您将其视为第一选择。许多公司看到了价值并选择 Coverity 或 Klocwork 作为长期解决方案,尽管我也看到运行 Findbugs 和 PMD。他们倾向于找到不同的东西,所以如果你的目标是尽可能多地找到和修复,最好将两者结合起来。
披露:我为 Coverity 的合作伙伴 Code Integrity Solutions (codeintegritysolutions.com) 工作。
这是商业分析工具列表:http ://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#Java_2
Coverity 有几个工具: http:
//www.coverity.com/html/coverity-readiness-manager-java.html:这应该与 findbugs 和 PMD 相当,但具有更好的展示
防止: http: //www.coverity.com/html/prevent-for-java.html:低误报。
线程分析器: http: //www.coverity.com/html/coverity-thread-analyzer-java.html:这是大多数开源工具所没有的。