1 FINDBUGS 是什么?
2 使用FINDBUGS的意义
4 BUGS示例
4.1 检测器:DC_DOUBLECHECK
4.2 检测器:DE_MIGHT_IGNORE
4.3 检测器:找出 HASH EQUALS 不匹配
4.4 检测器:NULL 指针对 NULL 的解引用(DEREFERENCE)和冗余比较
5 FINDBUGS安装与运行
6 参考資料
FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。在编译期预测出运行期代码缺陷。
FindBugs承诺无需开发人员费劲就能找出代码中已有的缺陷。当然,如果有多年的编写经验,就会知道这些承诺并不是一定能兑现。尽管如此,好的静态分析工具仍然是工具箱中的无价之宝。
FindBugs所能主要包括:
代码质量工具的一个问题是它们容易为开发人员提供大量但并非真正问题的问题——即 伪问题(false positives)。出现伪问题时,开发人员要学会忽略工具的输出或者放弃它。FindBugs 的设计者 David Hovemeyer 和 William Pugh 注意到了这个问题,并努力减少他们所报告的伪问题数量。与其他静态分析工具不同,FindBugs 不注重样式或者格式,它试图只寻找真正的缺陷或者潜在的性能问题。
略
//DC_DOUBLECHECK class Foo { private Helper helper = null; public Helper getHelper() { if (helper == null) helper = new Helper(); return helper; } // other functions and members... }
//DC_DOUBLECHECK class Foo { private Helper helper = null; public synchronized Helper getHelper() { if (helper == null) helper = new Helper(); return helper; } // other functions and members... }
// DE_MIGHT_IGNORE jp.co.softbrain.stc.document.download.DBToFile.downLoadFile try{ ServletOutputStream out = resp.getOutputStream(); out.println(e.toString()); out.flush(); out.close(); throw e; } catch (Exception ee) {}
这个检测器寻找与 equals() 和 hashCode() 的实现相关的几个问题。这两个方法非常重要,因为几乎所有基于集合的类—— List、Map、Set 等都调用它们。一般来说,这个检测器寻找两种不同类型的问题——当一个类:重写对象的 equals() 方法,但是没有重写它的 hashCode 方法,或者相反的情况时。
1 String b= "bob"; 2 b.replace('b', 'p'); 3 if(b.equals("pop"))
这个错误很常见。在第 2 行,程序员认为他已经用 p 替换了字符串中的所有 b。确实是这样,但是他忘记了字符串是不可变的。所有这类方法都返回一个新字符串,而从来不会改变消息的接收者。
这个检测器查找两类问题。它查找代码路径将会或者可能造成 null 指针异常的情况,它还查找对 null 的冗余比较的情况。例如,如果两个比较值都为 null,那么它们就是冗余的并可能表明代码错误。FindBugs 在可以确定一个值为 null 而另一个值不为 null 时,检测类似的错误,如清单 2 所示:
1 Person person = aMap.get("bob"); 2 if (person != null) { 3 person.updateAccessTime(); 4 } 5 String name = person.getName();
名称 | 备注 |
Findbugs | http://prdownloads.sourceforge.net/findbugs/findbugs-1.3.9.zip?download |
[1] FindBugs - Find Bugs in Java Programs(original site)
http://findbugs.sourceforge.net/
[2] FindBugs Pattern説明
http://www.limy.org/program/java/findbug_patterns.html
[3] FindBugs手册(日語)
http://www.simeji.com/findbugs/doc/manual_ja/