我熟悉一些免费的Java静态分析工具,如FindBugs和PMD。我想知道的是,像Klocwork和Coverity这样的商业产品是如何与这些产品相抗衡的。他们的长处和短处是什么?
我们使用一套开源和商业静态分析工具。不同的工具发现了不同类型的错误,有些工具被调整为更低的假阳性率,代价是可能错过一些真正的问题。
根据我的经验,Findbugs在发现真正的问题方面做得很好,尤其是当你像他们的团队建议的那样关注正确性错误时。最近,Findbugs的开发人员也添加了一些基本的安全漏洞检查。Coverity的假阳性率很低,尤其是如果你不打开他们的实验检查器,Coverity Prevent包括一个用于趋势/聚类分析的良好跟踪数据库。我还不相信他们的线程检查器(静态或动态)能工作-至少他们没有发现任何对我们感兴趣的东西。Klocworks Developer for Java返回的误报率更高,但我们发现他们拥有这些工具中最强的安全检查。因此,这取决于您的优先级是质量检查(Findbugs、Coverity)还是安全漏洞分析(Klocwork或Fortify)。我们的一些开发人员还使用PMD来支持源代码审查,因为它有助于一般的代码清理。
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。他们往往会发现不同的东西,所以如果你的目标是找到并解决尽可能多的问题,那么两者结合是很好的。
披露:我为代码完整性解决方案(codeintegritysolutions.com)工作,该公司是Coverity的合作伙伴。
以下是商业分析工具列表: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:这是大多数开源工具所没有的。