由马里兰大学Bill Pugh教授开发的FindBugs是一个开源的(LGPL)静态代码分析工具(无需运行就能对代码进行分析的工具),目的是找出Java代码中的常见缺陷。现在使用FindBugs的人越来越多了,很多知名企业包括美国银行、eBay、Oracle、Sun Microsystems以及Google等都在使用FindBugs,此外Bill Pugh还是Google的访问学者。
Findbugs主要着眼于寻找代码中的缺陷,这就与其他类似工具有些区别了,比如说Checkstyle和PMD就是根据样式(style)来改进代码质量的。FindBugs分析引擎与Checkstyle和PMD也有所不同,因为它直接操作类文件(class文件)而不是源代码。我们可以通过命令行、各种构建工具(如Ant、Cruise Control、Hudson及Maven等)、独立的Swing GUI或是以Eclipse和NetBeans IDE插件的方式来运行FindBugs。输出结果既可以是XML的,也可以是文本形式的。目前的FindBugs分析引擎已经对大约300个不同的bug模式进行过测试。完成这个工作的检测器也是非常直观的,同时该软件还支持插件架构,这样开发者就可以增加自己的检测器了。与PMD通过模式语言来描述bug不同,FindBugs的检测器是用Java开发的。
开发者可以通过多种方式来使用静态代码分析工具,最常见的两个使用场景分别是在新编写模块的代码审查上以及对现有代码进行更大范围的审查上。这两个使用场景其实是有很大区别的。对于前一种情况,开发者通常会检查工具所发现的有疑问的代码,然后去修改代码(即便这个问题对应用本身并没有什么影响时也是如此)。与此相反,在审查已有代码时,由于代码已经处于产品阶段且并没有造成什么明显的问题,开发者在修改之前需要先熟悉一下代码,因此其修改代价就很高了。FindBugs分析引擎一直在持续地改进,同时新的1.3.9版中还添加了12个新的检测器,自从1.3.9之后FindBugs就开始重点解决第二种情况了。比如说,FindBugs总是将每一种bug模式划分到某个类别中,如正确性、最差实践、性能与国际化等,然后为其指定高、中、低优先级。对于开发者来说,可以通过这种方式从庞大的代码中过滤掉那些不重要的缺陷。这个概念在1.3.9版中得到了扩充:增加了bug级别(1—20)以及根据级别进行过滤的能力。即将于今年底发布的2.0版还可以根据用户自己定制的优先级来客户化bug级别信息。
FindBugs 2.0的一个重要特性就是社区审查,意思就是说任何人都能检查开源项目中的问题(比如说将其标识成“必须解决”或是“没什么问题”等),同时这些审查信息会持久化到一个中央存储中,而其他审查者则可以自动共享这些内容。我们可以通过FindBugs站点来获取该功能的早期beta版,其上的一个Java Web Start应用显示了对Sun JDK 7以及Eclipse 3.5(Java 1.5+)的审查结果,同时该功能也通过了Google的考核,正如FindBugs主页上所说:
今年5月13、14日这两天,Google专门针对UMD FindBugs静态代码分析工具举办了一个全球大会,用以找出Java软件中的代码问题。此次大会的重心在于让Google的工程师们决定FindBugs所找出的Google4,000个最高优先级问题中所需修复的问题。700多个工程师运行了FindBugs。其中250多个工程师检查了8,000多个问题。每个检查其实就是对问题的一种分类:必须修复、应该修复、没什么影响、并非bug以及其他几个类别。其中有超过75%的检查将问题标为必须修复、应该修复或是我会修复。其中每个问题都被检查了10遍以上。
这些工程师们已经提交的变更修正了3,800个问题当中的1,100多个,他们提出了1,700个bug报告,其中的600个已经被标示为修复。随后人们继续对这些问题加以讨论并打算将FindBugs集成到Google的软件开发过程当中。
此次大会还展示了FindBugs的一些新功能:以云计算与社交网络为背景。对问题的审查会被立刻持久化到中央存储当中,这样其他开发者也能看到这些问题了,同时FindBugs还被集成到了Google的内部工具当中以查看bug报告及浏览源代码的版本控制历史。对于此次大会来说,FindBugs被设置为这样一种模式:工程师只有进入到自己的审查后才能查看别人的审查结果,之后配置又被改成更加开发的形式:工程师无需提供自己的审查结果就能查看别人的了。
静态代码分析工具并非银弹,其他的一些技术比如设计、代码审查以及测试等也非常重要,但如果恰当使用的话无论对个人还是项目来说都会收到意想不到的效果。
查看英文原文:Bill Pugh Releases FindBugs 1.3.9