`

FindBugs

阅读更多

http://www.ibm.com/developerworks/cn/java/j-findbug1/

http://www.ibm.com/developerworks/cn/java/j-findbug2/

FindBugs

  静态分析工具承诺无需开发人员费劲就能找出代码中已有的缺陷。当然,如果有多年的编写经验,就会知道这些承诺并不是一定能兑现。尽管如此,好的静态分 析工具仍然是工具箱中的无价之宝。在这个由两部分组成的系列文章的第一部分中,高级软件工程师 Chris Grindstaff 分析了 FindBugs 如何帮助提高代码质量以及排除隐含的缺陷。代码质量工具的一个问题是它们容易为开发人员提供大量但并非真正问题的问题——即 伪问题(false positives) 。 出现伪问题时,开发人员要学会忽略工具的输出或者放弃它。FindBugs 的设计者 David Hovemeyer 和 William Pugh 注意到了这个问题,并努力减少他们所报告的伪问题数量。与其他静态分析工具不同,FindBugs 不注重样式或者格式,它试图只寻找真正的缺陷或者潜在的性能问题。
  FindBugs 是什么?
  FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。不是通过分析类文件的形式或结 构来确定程序的意图,而是通常使用 Visitor 模式(请参阅 参考资料 )。图 1 显示了分析一个匿名项目的结果(为防止可怕的犯罪,这里不给出它的名字):
  在FindBugs的GUI中,需要先选择待扫描的.class文件(FindBugs其实就 是对编译后的class进行扫描,藉以发现一些隐藏的bug。)。如果你拥有这些.class档对应的源文件,可把这些.java文件再选上,这样便可以 从稍后得出的报告中快捷的定位到出问题的代码上面。此外,还可以选上工程所使用的library,这样似乎可以帮助FindBugs做一些高阶的检查,藉 以发现一些更深层的bug。
  选定了以上各项后,便可以开始检测了。检测的过程可能会花好几分钟,具体视工程的规模而定。检 测完毕可生成一份详细的报告,藉由这份报告,可以发现许多代码中间潜在的bug。比较典型的,如引用了空指针(null pointer dereference), 特定的资源(db connection)未关闭,等等。如果用人工检查的方式,这些bug可能很难才会被发现,或许永远也无法发现,直到运行时发作…当除掉了这些典型的 (classic) bug后,可以确信的是,我们的系统稳定度将会上一个新的台阶。
  以目前遇到的状况来看,FindBugs可以有两种使用时机。
  开发阶段
  当Developer完成了某一部分功能模块开发的时候(这通常是指代码撰写完成,并已 debug通过之后),可藉由FindBugs对该模块涉及的java文件进行一次扫描,以发现一些不易察觉的bug或是效能问题。交付新版的时候,开发 团队可以跑一下FindBugs,除掉一些隐藏的Bug。FindBugs得出的报告可以作为该版本的一个参考文档一并交付给测试团队留档待查。
  在开发阶段使用FindBugs,一方面开发人员可以对新版的品质更有信心,另一方面,测试人 员藉此可以把更多的精力放在业务逻辑的确认上面,而不是花大量精力去进一些要在特殊状况下才可能出现的BUG(典型的如Null Pointer Dereference)。从而可以提高测试的效率。
  维护阶段
  这里指的是系统已经上线,却发现因为代码中的某一个bug导致系统崩溃。在除掉这个已暴露的 bug之后,为了快速的找出类似的但还未暴露的 bug,可以使用FindBugs对该版的代码进行扫描。当然,在维护阶段使用FindBugs往往是无奈之举,且时间紧迫。此外,如果本来在新版交付的 时候就使用过FindBugs的话,往往意味着这种bug是FindBugs还无法检测出的。这也是FindBugs局限的地方。
  FindBugs出到目前的版本,功能已经相当强大,不过也有待完善的地方。从实际使用来看, 有一些隐藏的bug并不能靠FindBugs直接发现。那么,可不可以撰写一个新的 Detector,来发现这种将一个未初始化的reference传来传去而形成的潜在的bug呢?理论上来讲,应该是可以的。这个 Detector目前还未实现。哪位如果有兴趣的话,可以参考FindBugs, Part 2: Writing custom detectors(扩展阅读)这篇文章,帮忙实现这个Detector。实现一个新的Detector,便可以检测出一种新型的bug,这样不知又可以 帮开发人员省去多少人工检查的时间,功德无量啊。
  FindBugs也不能发现非java的Bug。对于非java撰写的代码,如 javacript,SQL等等,要找出其中可能的bug,FindBugs是无能为力的。当然,javacript中的bug似乎还不至于使系统崩 溃,而SQL中的bug往往又跟业务逻辑相关,只要测试仔细一些应该是可以发现的。
  FindBugs不过是一个工具。作为开发人员,当然首先要在编程的时候努力避免引入bug, 而不要依赖于某个工具来为自己把关。不过由于代码的复杂性,一些隐藏的bug确实很难靠咱们的肉眼发现。这时,应用一些好的工具或许就可以帮你发现这样的 bug。这便是FingBug存在的价值。
  为什么应该将 FindBugs 集成到编译过程中?
  经常问到的第一个问题是为什么要将 FindBugs 加入到编译过程中?虽然有大量理由,最明显的回答是要保证尽可能早地在进行编译时发现问题。当团队扩大,并且不可避免地在项目中加入更多新开发人员 时,FindBugs 可以作为一个安全网,检测出已经识别的缺陷模式。我想重申在一篇 FindBugs 论文中表述的一些观点。如果让一定数量的开发人员共同工作,那么在代码中就会出现缺陷。像 FindBugs 这样的工具当然不会找出所有的缺陷,但是它们会帮助找出其中的部分。现在找出部分比客户在以后找到它们要好——特别是当将 FindBugs 结合到编译过程中的成本是如此低时。
  一旦确定了加入哪些过滤器和类,运行 FindBugs 就没什么成本了,而带来的好处就是它会检测出新缺陷。如果编写特定于应用程序的检测器,则这个好处可能更大。
  生成有意义的结果
  重要的是要认识到这种成本/效益分析只有在不生成大量误检时才有效。换句话说,如果在每次编译 时,不能简单地确定是否引入了新的缺陷,那么这个工具的价值就会被抵消。分析越自动化越好。如果修复缺陷意味着必须吃力地分析检测出的大量不相干的缺陷, 那么您就不会经常使用它,或者至少不会很好地使用它。
  确定不关心哪些问题并从编译中排除它们。也可以挑出 确实 关注的一小部分检测器并只运行它们。另一种选择是从个别的类中排除一组检测器,但是其他的类不排除。FindBugs 提供了使用过滤器的极大灵活性,这可帮助生成对团队有意义的结果,由此我们进入下一节。
  确定用 FindBugs 的结果做什么
  可能看来很显然,但是您想不到我参与的团队中有多少加入了类似 FindBugs 这样的工具而没有真正利用它。让我们更深入地探讨这个问题——用结果做什么?明确回答这个问题是困难的,因为这与团队的组织方式、如何处理代码所有权问题 等有很大关系。不过,下面是一些指导:
  可以考虑将 FindBugs 结果加入到源代码管理(SCM)系统中。一般的经验做法是不将编译工件(artifact)放到 SCM 系统中。不过,在这种特定情况下,打破这个规则可能是正确的,因为它使您可以监视代码质量随时间的变化。
  可以选择将 XML 结果转换为可以发送到团队的网站上的 HTML 报告。转换可以用 XSL 样式表或者脚本实现。有关例子请查看 FindBugs 网站或者邮件列表(请参阅 参考资料)。
  像 FindBugs 这样的工具通常会成为用于敲打团队或者个人的政治武器。尽量抵制这种做法或者不让它发生——记住,它只是一个工具,它可以帮助改进代码的质量。有了这种思想,在下一部分中,我将展示如何编写自定义缺陷检测器。

分享到:
评论

相关推荐

    findbugs 1.3.9 findbugs 1.3.9

    《深入理解FindBugs 1.3.9:静态代码分析的强大工具》 FindBugs是一款广受欢迎的静态代码分析工具,它的版本1.3.9在软件开发领域具有重要的地位。这款开源工具的主要功能是检测Java代码中的潜在错误,帮助开发者在...

    findbugs-annotations-1.3.9-1-API文档-中文版.zip

    赠送jar包:findbugs-annotations-1.3.9-1.jar; 赠送原API文档:findbugs-annotations-1.3.9-1-javadoc.jar; 赠送源代码:findbugs-annotations-1.3.9-1-sources.jar; 赠送Maven依赖信息文件:findbugs-...

    网络上搜集的Findbugs在Ant下的配置方法

    **Findbugs在Ant下的配置方法** FindBugs是一款开源的静态代码分析工具,主要用于检测Java代码中的潜在错误、坏味道和安全漏洞。它通过分析字节码而非源代码,能够发现许多编译器无法捕获的问题。在Ant构建环境中...

    findbugs最新源代码20081008版本的

    《深入理解FindBugs:基于20081008源码的探索》 FindBugs是一款著名的静态代码分析工具,它通过扫描Java字节码来检测潜在的错误和不良编程习惯,被誉为“程序员的无声守护者”。2008年10月08日的版本是FindBugs发展...

    findbugs工具测试java实验报告

    【findbugs工具测试Java实验报告】 在软件开发过程中,代码质量是至关重要的,因为它直接影响到程序的稳定性、可维护性和性能。为了确保代码的质量,开发者通常会采用各种静态代码分析工具,其中FindBugs就是一款...

    findbugs.jar+findbugs-ant.jar

    FindBugs是一款非常知名的静态代码分析工具,它主要用于在Java代码中发现潜在的错误和缺陷。Eclipse是一款广泛使用的集成开发环境(IDE),对于Java开发者来说尤其重要。将FindBugs集成到Eclipse中,可以帮助开发者...

    findbugs插件使用文档

    `FindBugs`是一款强大的静态代码分析工具,主要用于检测Java代码中的潜在错误和不良实践。它通过分析字节码来找出可能存在的问题,而无需实际运行程序。在Maven项目中,我们可以使用`findbugs-maven-plugin`这个...

    IDEA插件-FindBugs-IDEA-1.0.1.rar

    IDEA插件-FindBugs-IDEA-1.0.1,威哥开发使用,决定可以用。自行导入IDEA。Findbugs是一个静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。Findbugs自带检测器,其中有60余种...

    findbugs压缩包+findbugs.jar+findbugs-ant.jar

    标题中的"findbugs压缩包+findbugs.jar+findbugs-ant.jar"指的是该压缩文件内包含FindBugs的主要库文件`findbugs.jar`,这是执行FindBugs分析的核心组件,它包含了各种检测规则和算法。另外,`findbugs-ant.jar`则是...

    FindBugs规则(中文版111).doc

    FindBugs是一款静态代码分析工具,它用于检测Java代码中的潜在缺陷。中文版的FindBugs规则文档提供了关于代码质量的多个方面的指导,包括安全、实验性等方面的问题。以下是这些规则的详细解释: 1. Dm: Hardcoded ...

    findbugs 最新eclipse插件

    **findbugs最新Eclipse插件**是用于静态代码分析的工具,它可以帮助开发者在编码阶段发现潜在的错误和不良编程习惯。FindBugs是开源项目,由University of Maryland开发并维护,广泛应用于Java应用程序的质量保证...

    findbugs最新版本 1.3.8

    FindBugs是一款开源的静态代码分析工具,专用于检测Java应用程序中的潜在错误和不良编程习惯。在Java开发中,FindBugs能够帮助开发者在代码执行之前发现潜在的问题,从而提高软件质量和可维护性。1.3.8是FindBugs的...

    findbugs代码检查工具

    FindBugs是一款强大的静态代码分析工具,主要用于检测Java代码中的潜在错误和不良编程习惯。它通过对编译后的字节码进行分析,而不需要实际运行代码,就能找出可能存在的问题,从而帮助开发者提升代码质量,减少运行...

    eclipse中findbugs插件

    FindBugs插件是将FindBugs工具集成到Eclipse中的一个扩展,使得用户在开发过程中可以方便地检查代码问题。 安装FindBugs插件的过程相对简单。首先,你需要下载`edu.umd.cs.findbugs.plugin.eclipse_3.0.1.20150306-...

    findbugs myeclipse2017可用插件

    FindBugs是一款强大的静态代码分析工具,主要用于检测Java应用程序中的潜在错误、不良编程习惯和可能的安全漏洞。在MyEclipse 2017这样的集成开发环境中(IDE)集成FindBugs插件,可以帮助开发者在编码阶段就发现并...

    findbugs-1.3.9.rar

    《FindBugs:Java代码静态分析工具的深度解析》 FindBugs是一款开源的Java代码静态分析工具,其主要功能是检测源代码中可能存在的错误和潜在问题。这个工具通过扫描字节码来查找可能的问题,而不是运行程序,因此...

    ecplise插件findbugs2.0

    【FindBugs 2.0 插件详解】 FindBugs 是一款强大的静态代码分析工具,主要用于检测 Java 应用程序中的潜在错误和缺陷。在 2.0 版本中,FindBugs 支持 JDK 1.6,并且能够与 Eclipse 3.2 及以上版本无缝集成,为...

    edu.umd.cs.findbugs.plugin.eclipse_1.3.9.20090821.rar

    《FindBugs工具详解及其Eclipse插件应用》 FindBugs是一款著名的静态代码分析工具,主要用于检测Java程序中的潜在错误和不良编程习惯。这款工具由University of Maryland的计算机科学学院开发并维护,其目标是帮助...

    Jenkins 与findbugs集成

    ### Jenkins 与 FindBugs 集成 在软件开发过程中,持续集成(CI)工具如Jenkins可以显著提高代码质量和开发效率。FindBugs是一款用于检测Java代码中潜在错误和漏洞的静态分析工具,它可以有效地帮助开发者在早期...

Global site tag (gtag.js) - Google Analytics