- 浏览: 474559 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
jyjava:
呵呵,不错,跟把结果放到哈市map中一样,在查询数据库之前,先 ...
if (log.isDebugEnabled()) {}使用场景初析 -
eileennaly:
你好 我最近在研究S2dao(工作需要)但是因为菜鸟一枚(刚刚 ...
S2Dao的执行 -
nswish:
谢谢,受教了!
单例模式中的饿汉式和懒汉式 -
shangweiqiang24:
正要用到,捡到宝啦! 谢谢啊。
Seasar和S2Dao简介 -
hugh1st:
模糊测试主要适合哪些软件/项目的测试呢?看《测试之美》的时候了 ...
模糊测试(Fuzzing Test)个人小结
说明:本文转载自<!----><!----><!---->http://www.cnblogs.com/tester2test/archive/2006/06/08/420832.html
Java 代码缺陷自动分析工具介绍
黄锡波
Java 代码缺陷自动分析工具主要有:Findbugs 、PMD 和CheckStyle 工具。这里重点介绍Findbugs 的使用,简要提及PMD 和CheckStyle 工具的使用。
1 FindBugs 是什么?
FindBugs 是一个java bytecode 静态分析工具,它可以帮助java 工程师提高代码质量以及排除隐含的缺陷。
FindBugs 检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。
有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。FindBugs 不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 Visitor 模式进行分析(Visitor 模式的更多信息 )。
2 FindBugs 可以做什么?
FindBugs 提供了35 个检测器来检测字节码中可能的缺陷。可以做的事情主要有:
2.1 找出 hash equals 不匹配
找与
equals()
和
hashCode()
的实现相关的几个问题。这两个方法非常重要,因为几乎所有基于集合的类---List
、Map
、Set
等都调用它们。一般来说,这个检测器寻找两种不同类型的问题:
①当一个类重写对象的
equals()
方法,但是没有重写它的
hashCode
方法,或者相反的情况时。
②定义一个 co-variant
版本的
equals()
或
compareTo()
方法。例如,
Bob
类定义其
equals()
方法为布尔
equals(Bob)
,它覆盖了对象中定义的
equals()
方法。因为 Java
代码在编译时解析重载方法的方式,在运行时使用的几乎总是在对象中定义的这个版本的方法,而不是在
Bob
中定义的那一个(除非显式将
equals()
方法的参数强制转换为
Bob
类型)。因此,当这个类的一个实例放入到类集合中的任何一个中时,使用的是
Object.equals()
版本的方法,而不是在
Bob
中定义的版本。在这种情况下,
Bob
类应当定义一个接受类型为
Object
的参数的
equals()
方法。
20090325(周三)补充:
关于equals()
方法
和
hashCode()方法,这两个方法一般是连体儿。某个类继承自Object类,假如重写这两个方法的其中一个时,“
必须
”重写另一个方法
(一般情况下是重写
equals()
方法,此时就要注意重写
hashCode()方法了
)
。
2.2 检测:忽略方法返回值
这个检测器查找代码中忽略了不应该忽略的方法返回值的地方。这种情况的一个常见例子是在调用
String
方法时,例如:
String aString = "bob"; aString.replace('b', 'p'); if(aString.equals("pop"))
这个错误很常见。在第 2 行,程序员认为他已经用 p 替换了字符串中的所有 b 。确实是这样,但是他忘记了字符串是不可变的。所有这类方法都返回一个新字符串,而从来不会改变消息的接收者。
20090325(周三)补充:
String
|
replace
(char oldChar,
char newChar)
Returns a new string resulting from replacing all occurrences of oldChar
in this string with
newChar
. |
注意:执行到第三句的时候,此时有两个字符串,一个是aString,此时的值还是“bob”;还有一个,就是replace方法返回的新字符串“pop”。
2.3 检测:Null 指针对 null 的解引用(dereference )和冗余比较
这个检测器查找两类问题。它查找代码路径将会或者可能造成 null 指针异常的情况,它还查找对 null 的冗余比较的情况。例如,如果两个比较值都为 null ,那么它们就是冗余的并可能表明代码错误。FindBugs 在可以确定一个值为 null 而另一个值不为 null 时,检测类似的错误,例如:
Person person = aMap.get("bob"); if (person != null) { person.updateAccessTime(); } String name = person.getName();
在这个例子中,如果第 1
行的
Map
不包括一个名为“bob
”的人,那么在第 5
行询问
person
的名字时就会出现 null
指针异常。因为 FindBugs
不知道 map
是否包含“bob
”,所以它将第 5
行标记为可能 null
指针异常。
20090325(周三)补充:
空指针异常,绝大多数情况都是null.***,想对为null的对象进行某种操作,必然会导致空指针异常。这种异常应该是Java编码中出现最频繁的异常了,应该引起足够的重视(在代码中多进行非空check)。
2.4 检测:初始化之前读取字段
这个检测器寻找在构造函数中初始化之前被读取的字段。这个错误通常是由使用字段名而不是构造函数参数引起的,例如在构造函数中读取未初始化的字段:
public class Thing { private List actions; public Thing(String startingActions) { StringTokenizer tokenizer = new StringTokenizer(startingActions); while (tokenizer.hasMoreTokens()) { actions.add(tokenizer.nextToken()); } } }
在这个例子中,第 6
行将产生一个 null
指针异常,因为变量
actions
还没有初始化。
20090325(周三)补充:
这个问题,应该不存在吧,Eclipse中出现这个情况会自动报错的,编译通不过,应该不需要劳驾FindBugs出马吧。
2.5 命名检查
对标准 Java 命令规范的测试:变量名称不应太短;方法名称不应过长;类名称应当以小写字母开头;方法和字段名应当以小写字母开头,等等。
2.6 未使用的代码检查
查找从未使用的私有字段和本地变量、执行不到的语句、从未调用的私有方法,等等。
20090325(周三)补充:
对多余代码的检查。私有字段或者私有方法,别人不能直接使用,假如在本类中都没有使用到,那还放在这边干嘛呢。(其实,私有字段和私有方法的出发点,也是只给本类使用的。)
2.7 嵌套检查
例如: switch 语句应当有 default 块,应当避免深度嵌套的 if 块,不应当给参数重新赋值,不应该对 double 值进行相等比较。
20090325(周三)补充:
1.switch 语句的各个case中,应该不能没有break语句,否则会发生case穿透现象;
2.至于default块,肯定也是要有的,这个是兜底保本的。
3.应当避免深度嵌套的 if 块:深度太深,程序的逻辑结构就看得不太清楚了,此时可以考虑重新组织逻辑,或者拆分成多个方法。
4.不应当给参数重新赋值:这个当然了,你既然使用了接受参数,在方法内又把人家传过来的值给重新赋值了,这叫什么事呀(要不就不要传这个参数进来,正所谓:用人不疑,疑人不用)。
5.不应该对 double 值进行相等比较:嗯,这个是要注意,double不像整数,它是不精确的(小数部分是由0101模拟的),所以无法直接对两个double数进行等值比较,一般都是比较两者的差是否小于某个值(比如0.0001,就相当于是精确到小数点后面第4位),若成立,则可以认为两者是”相等“的。
2.8 导入语句检查
检查 import 语句的问题,比如同一个类被导入两次或者被导入 java.lang 的类中。
20090325(周三)补充:
同一个类导入一次就知道了,何必画蛇添足,导入第二遍呢,吃力不讨好。
导入 java.lang:大哥,这包不导入就能直接使用的,你又何必呢。
2.9 JUnit 测试检查
查找测试用例和测试方法的特定问题,例如方法名称的正确拼写,以及 suite() 方法是不是 static 和 public 。
2.10 字符串检查
找出处理字符串时遇到的常见问题,例如重复的字符串标量,调用 String 构造函数,对 String 变量调用 toString() 方法。
20090325(周三)补充:
重复的字符串标量:此处的字符串标量,应该说的是字符串常量吧,这个字符串常量啊,是存放在内存的Data Segment(数据区)中的,一般一份就够了,没有必要进行重复定义。
对 String 变量调用 toString() 方法:对 String 变量进行打印输出时,默认调用的就是 toString() 方法,返回的就是它自身,何必要显示地写出来呢。
调用 String 构造函数???我一下子没看出这个有何不妥之处 ???
2.11 括号检查
检查 for 、 if 、 while 和 else 语句是否使用了括号。
20090325(周三)补充:
这个问题也是要注意一下,开始时只有一句语句时,从执行效果上来讲,加不加这个括号都是没有问题的。
但是不加括号是个很不好的习惯,有隐藏的问题:将来追加代码,直接加在原先一句的后面,目的是想将代码加在语句块内,但是因为前面没有加括号,假如此时也忘记加括号,这样的话,代码的逻辑显然就错了。
所以啊,哪怕此时代码段中的语句只有一句,也要加上括号,避免隐患。
2.12 代码尺寸检查
测试过长的方法、有太多方法的类以及重构方面的类似问题。
2.13 终结函数检查
因为在 Java 语言中, finalize() 方法不是那么普遍,它们的使用规则虽然很详细,但是人们对它们相对不是很熟悉。这类检查查找 finalize() 方法的各种问题,例如空的终结函数,调用其他方法的 finalize() 方法,对 finalize() 的显式调用,等等。
2.14 克隆检查
用于 clone() 方法的新规则。凡是重写 clone() 方法的类都必须实现 Cloneable , clone() 方法应该调用 super.clone() ,而 clone() 方法应该声明抛出 CloneNotSupportedException 异常,即使实际上没有抛出异常,也要如此。
20090325(周三)补充:
protected Object
|
clone
()
Creates and returns a copy of this object. |
protected Object clone () throws CloneNotSupportedException
2.15 耦合检查
查找类之间过度耦合的迹象,比如导入内容太多;在超类型或接口就已经够用的时候使用子类的类型;类中的字段、变量和返回类型过多等。
2.16 异常检查
针对异常的检查:不应该声明该方法而抛出 java.lang.Exception 异常,不应当将异常用于流控制,不应该捕获 Throwable ,等等。
20090325(周三)补充:
不应该捕获 Throwable:这家伙是可逮可不逮的异常,你逮它干嘛。
2.17 日志检查
查找 java.util.logging.Logger 的不当使用,包括非终状态(nonfinal )、非静态的记录器,以及在一个类中有多个记录器。
2.18 Open—Close 检查
检查文件或通讯方面,是否忘记Close 的情况。
20090325(周三)补充:
说的意思主要是:资源(文件资源、连接资源)用也用了,但是最后记得帮人家把资源给关了,有始有终嘛。
2.19 其它检查
其它缺陷清单可参见:缺陷清单
2.20 构建自己的规则集
可以构建自己的规则集
说明:更多关于使用和其他工具分析的部分请参考:<!----><!----> <!---->
http://www.cnblogs.com/tester2test/archive/2006/06/08/420832.html
20090325(周三)补充:
本部门首席技术专家配置了一下,可以每小时生成一次报告,里面详细列出了哪些文件中哪个地方有隐藏的“bug”。
我根据自己的一些理解,对上述规则进行了一点补充说明。
发表评论
-
Linux下Trac安装手记
2009-07-29 10:59 2096Linux下Trac安装手记 版权声明 :可以 ... -
Trac+subversion拥有强大的bug管理能力(介绍和Windows下安装)
2009-07-29 10:53 2482Trac+subversion拥有强大 ... -
读取properties属性文件中的配置信息
2009-03-19 17:55 1719示例代码: // 将指定路径下的资源文件中的 ... -
SQLServerException: Invalid object name '***_VIEW_
2009-03-19 13:52 3312现象:本地测试(拉了最新代码),选择类别的时候,页 ... -
“妖怪”问题也是有原因的
2009-03-17 16:48 1008今天,bug对应过程中 ... -
如何处理日文系统中的NEC拡張字
2009-03-16 17:04 1866http://blog.csdn.net/luyang101 ... -
通知メールで文字化け
2009-03-16 16:46 1665邮件乱码问题 通知メールで ... -
搜索条件 关键字
2009-03-16 16:44 1274如果条件入力部分支持多个入力关键字的,也就是以空格分隔关键字的 ... -
读取XSL文件指定节点(Subject)的值
2009-03-16 11:40 3649调用方: //以URL形式获取到连接到邮件文本xsl文件 ... -
NBS编码小结2
2009-03-11 20:56 1917SQL 语句错误: Caused by: ... -
NBS编码小结1
2009-03-11 19:50 1278千万注意:对象非空的判断一定要时时刻刻注意!否则极有可能 ... -
BVT应该测些什么?
2009-03-06 19:36 1961BVT应该测些什么? ... -
截图啊截图
2009-02-24 23:22 1075UT 测试时,发现 bug ,在 Track ... -
虚拟机重启后,使用域帐户却进不去了。
2009-02-23 21:25 2133虚拟机重启后,使用域帐户却进不去了。 尝试: ... -
临时map、正式map、数据库
2009-02-17 20:00 1304临时 map 、正式 map 、数据库 主 ... -
将int类型转换成String类型、List的使用和Eclipse插件implementors
2009-02-13 21:13 3564将 int 类型转换成 String 类型: ... -
SVN的getLock问题和数据库表中“日時”字段的长度问题
2009-02-12 17:47 1678SVN 的 getLock 问题:想修改 doc ... -
工具check Style和Find Bugs生成的report、Code两点
2009-02-11 18:55 1003工具 check Style 和 Find Bug ... -
SVN使用小记
2009-02-10 18:36 4429SVN 使用小记 问题 1 : S ... -
IMのバッチ機能でメール送信バッチ 15分間一回実行
2009-01-19 16:09 1255日方客 户 想实现一种功能:每 15 分钟,运行一次 ...
相关推荐
标题中的"findbugs压缩包+findbugs.jar+findbugs-ant.jar"指的是该压缩文件内包含FindBugs的主要库文件`findbugs.jar`,这是执行FindBugs分析的核心组件,它包含了各种检测规则和算法。另外,`findbugs-ant.jar`则是...
《FindBugs 3.0.1:Java代码静态分析工具深度解析》 FindBugs是一款广受欢迎的开源工具,用于检测Java代码中的潜在错误和不良编程习惯。在"findbugs-3.0.1.zip"这个压缩包中,包含了FindBugs 3.0.1版本的详细资料和...
《深入理解FindBugs 1.3.9:静态代码分析的强大工具》 FindBugs是一款广受欢迎的静态代码分析工具,它的版本1.3.9在软件开发领域具有重要的地位。这款开源工具的主要功能是检测Java代码中的潜在错误,帮助开发者在...
赠送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是一款开源的静态代码分析工具,主要用于检测Java代码中的潜在错误、坏味道和安全漏洞。它通过分析字节码而非源代码,能够发现许多编译器无法捕获的问题。在Ant构建环境中...
《深入理解FindBugs:基于20081008源码的探索》 FindBugs是一款著名的静态代码分析工具,它通过扫描Java字节码来检测潜在的错误和不良编程习惯,被誉为“程序员的无声守护者”。2008年10月08日的版本是FindBugs发展...
【findbugs工具测试Java实验报告】 在软件开发过程中,代码质量是至关重要的,因为它直接影响到程序的稳定性、可维护性和性能。为了确保代码的质量,开发者通常会采用各种静态代码分析工具,其中FindBugs就是一款...
FindBugs是一款非常知名的静态代码分析工具,它主要用于在Java代码中发现潜在的错误和缺陷。Eclipse是一款广泛使用的集成开发环境(IDE),对于Java开发者来说尤其重要。将FindBugs集成到Eclipse中,可以帮助开发者...
`FindBugs`是一款强大的静态代码分析工具,主要用于检测Java代码中的潜在错误和不良实践。它通过分析字节码来找出可能存在的问题,而无需实际运行程序。在Maven项目中,我们可以使用`findbugs-maven-plugin`这个...
IDEA插件-FindBugs-IDEA-1.0.1,威哥开发使用,决定可以用。自行导入IDEA。Findbugs是一个静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。Findbugs自带检测器,其中有60余种...
FindBugs是一款静态代码分析工具,它用于检测Java代码中的潜在缺陷。中文版的FindBugs规则文档提供了关于代码质量的多个方面的指导,包括安全、实验性等方面的问题。以下是这些规则的详细解释: 1. Dm: Hardcoded ...
**findbugs最新Eclipse插件**是用于静态代码分析的工具,它可以帮助开发者在编码阶段发现潜在的错误和不良编程习惯。FindBugs是开源项目,由University of Maryland开发并维护,广泛应用于Java应用程序的质量保证...
FindBugs是一款开源的静态代码分析工具,专用于检测Java应用程序中的潜在错误和不良编程习惯。在Java开发中,FindBugs能够帮助开发者在代码执行之前发现潜在的问题,从而提高软件质量和可维护性。1.3.8是FindBugs的...
FindBugs是一款强大的静态代码分析工具,主要用于检测Java代码中的潜在错误和不良编程习惯。它通过对编译后的字节码进行分析,而不需要实际运行代码,就能找出可能存在的问题,从而帮助开发者提升代码质量,减少运行...
FindBugs是一款强大的Java字节码静态分析工具,它能够帮助开发者在代码执行前发现潜在的缺陷和质量问题。通过检查类文件和JAR包,FindBugs与一系列预定义的缺陷模式进行匹配,从而找出可能存在的问题。这种静态分析...
FindBugs插件是将FindBugs工具集成到Eclipse中的一个扩展,使得用户在开发过程中可以方便地检查代码问题。 安装FindBugs插件的过程相对简单。首先,你需要下载`edu.umd.cs.findbugs.plugin.eclipse_3.0.1.20150306-...
FindBugs是一款强大的静态代码分析工具,主要用于检测Java应用程序中的潜在错误、不良编程习惯和可能的安全漏洞。在MyEclipse 2017这样的集成开发环境中(IDE)集成FindBugs插件,可以帮助开发者在编码阶段就发现并...
《FindBugs:Java代码静态分析工具的深度解析》 FindBugs是一款开源的Java代码静态分析工具,其主要功能是检测源代码中可能存在的错误和潜在问题。这个工具通过扫描字节码来查找可能的问题,而不是运行程序,因此...
【FindBugs 2.0 插件详解】 FindBugs 是一款强大的静态代码分析工具,主要用于检测 Java 应用程序中的潜在错误和缺陷。在 2.0 版本中,FindBugs 支持 JDK 1.6,并且能够与 Eclipse 3.2 及以上版本无缝集成,为...