由马里兰大学 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 被设置为这样一种模式:工程师只有进入到自己的审查后才能查看别人的审查结果,之后配置又被改成更加开发的形式:工程师无需提供自己的审查结果就能查看别人的了。
静态代码分析工具并非银弹,其他的一些技术比如设计、代码审查以及测试等也非常重要,但如果恰当使用的话无论对个人还是项目来说都会收到意想不到的效果。
评论