java代码缺陷自动分析工具之FindBugs介绍

上传人:M****1 文档编号:508132679 上传时间:2023-01-15 格式:DOC 页数:8 大小:26.51KB
返回 下载 相关 举报
java代码缺陷自动分析工具之FindBugs介绍_第1页
第1页 / 共8页
java代码缺陷自动分析工具之FindBugs介绍_第2页
第2页 / 共8页
java代码缺陷自动分析工具之FindBugs介绍_第3页
第3页 / 共8页
java代码缺陷自动分析工具之FindBugs介绍_第4页
第4页 / 共8页
java代码缺陷自动分析工具之FindBugs介绍_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《java代码缺陷自动分析工具之FindBugs介绍》由会员分享,可在线阅读,更多相关《java代码缺陷自动分析工具之FindBugs介绍(8页珍藏版)》请在金锄头文库上搜索。

1、java代码缺陷自动分析工具之FindBugs介绍.txt逆风的方向,更适合飞翔。我不怕万人阻挡,只怕自己投降。你发怒一分钟,便失去60分钟的幸福。忙碌是一种幸福,让我们没时间体会痛苦;奔波是一种快乐,让我们真实地感受生活;疲惫是一种享受,让我们无暇空虚。生活就像呼吸呼是为出一口气,吸是为争一口气。1 FindBugs是什么?FindBugs 是一个java bytecode静态分析工具,它可以帮助java工程师提高代码质量以及排除隐含的缺陷。FindBugs检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。

2、FindBugs不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 Visitor 模式进行分析。2 FindBugs可以做什么?FindBugs提供了35个检测器来检测字节码中可能的缺陷。可以做的事情主要有:2.1 找出 hash equals 不匹配 找与 equals() 和 hashCode() 的实现相关的几个问题。这两个方法非常重要,因为几乎所有基于集合的类-List、Map、Set 等都调用它们。一般来说,这个检测器寻找两种不同类型的问题:当一个类重写对象的 equals() 方法,但是没有重写它的 hashCode 方法,或者相反的情况时。 定义一个 co-varia

3、nt 版本的 equals() 或 compareTo() 方法。例如, Bob 类定义其 equals() 方法为布尔 equals(Bob) ,它覆盖了对象中定义的 equals() 方法。因为 Java 代码在编译时解析重载方法的方式,在运行时使用的几乎总是在对象中定义的这个版本的方法,而不是在 Bob 中定义的那一个(除非显式将 equals() 方法的参数强制转换为 Bob 类型)。因此,当这个类的一个实例放入到类集合中的任何一个中时,使用的是 Object.equals() 版本的方法,而不是在 Bob 中定义的版本。在这种情况下, Bob 类应当定义一个接受类型为 Object

4、的参数的 equals() 方法。 2.2 检测:忽略方法返回值 这个检测器查找代码中忽略了不应该忽略的方法返回值的地方。这种情况的一个常见例子是在调用 String 方法时,例如:1 String aString = bob;2 b.replace(b, p);3 if(b.equals(pop)这个错误很常见。在第 2 行,程序员认为他已经用 p 替换了字符串中的所有 b。确实是这样,但是他忘记了字符串是不可变的。所有这类方法都返回一个新字符串,而从来不会改变消息的接收者。2.3 检测:Null 指针对 null 的解引用(dereference)和冗余比较 这个检测器查找两类问题。它查找

5、代码路径将会或者可能造成 null 指针异常的情况,它还查找对 null 的冗余比较的情况。例如,如果两个比较值都为 null,那么它们就是冗余的并可能表明代码错误。FindBugs 在可以确定一个值为 null 而另一个值不为 null 时,检测类似的错误,例如: 1 Person person = aMap.get(bob);2 if (person != null) 3 person.updateAccessTime();4 5 String name = person.getName();在这个例子中,如果第 1 行的 Map 不包括一个名为“bob”的人,那么在第 5 行询问 per

6、son 的名字时就会出现 null 指针异常。因为 FindBugs 不知道 map 是否包含“bob”,所以它将第 5 行标记为可能 null 指针异常。 2.4 检测:初始化之前读取字段 这个检测器寻找在构造函数中初始化之前被读取的字段。这个错误通常是由使用字段名而不是构造函数参数引起的,例如在构造函数中读取未初始化的字段:1 public class Thing 2 private List actions;3 public Thing(String startingActions) 4 StringTokenizer tokenizer = new StringTokenizer(st

7、artingActions);5 while (tokenizer.hasMoreTokens() 6 actions.add(tokenizer.nextToken();7 8 9 在这个例子中,第 6 行将产生一个 null 指针异常,因为变量 actions 还没有初始化。 2.5 命名检查对标准 Java 命令规范的测试:变量名称不应太短;方法名称不应过长;类名称应当以小写字母开头;方法和字段名应当以小写字母开头,等等。2.6 未使用的代码检查查找从未使用的私有字段和本地变量、执行不到的语句、从未调用的私有方法,等等。2.7 嵌套检查例如: switch 语句应当有 default 块

8、,应当避免深度嵌套的 if 块,不应当给参数重新赋值,不应该对 double 值进行相等比较。2.8 导入语句检查检查 import 语句的问题,比如同一个类被导入两次或者被导入 java.lang 的类中。2.9 JUnit 测试检查查找测试用例和测试方法的特定问题,例如方法名称的正确拼写,以及 suite() 方法是不是 static 和 public。2.10 字符串检查找出处理字符串时遇到的常见问题,例如重复的字符串标量,调用 String 构造函数,对 String 变量调用 toString() 方法。2.11 括号检查检查 for、 if、 while 和 else 语句是否使用

9、了括号。2.12 代码尺寸检查测试过长的方法、有太多方法的类以及重构方面的类似问题。2.13 终结函数检查因为在 Java 语言中, finalize() 方法不是那么普遍,它们的使用规则虽然很详细,但是人们对它们相对不是很熟悉。这类检查查找 finalize() 方法的各种问题,例如空的终结函数,调用其他方法的 finalize() 方法,对 finalize() 的显式调用,等等。2.14 克隆检查用于 clone() 方法的新规则。凡是重写 clone() 方法的类都必须实现 Cloneable, clone() 方法应该调用 super.clone(),而 clone() 方法应该声明

10、抛出 CloneNotSupportedException 异常,即使实际上没有抛出异常,也要如此。2.15 耦合检查查找类之间过度耦合的迹象,比如导入内容太多;在超类型或接口就已经够用的时候使用子类的类型;类中的字段、变量和返回类型过多等。2.16 异常检查针对异常的检查:不应该声明该方法而抛出 java.lang.Exception 异常,不应当将异常用于流控制,不应该捕获 Throwable,等等。2.17 日志检查查找 java.util.logging.Logger 的不当使用,包括非终状态(nonfinal)、非静态的记录器,以及在一个类中有多个记录器。2.18 OpenClose

11、检查检查文件或通讯方面,是否忘记Close的情况。2.19 其它检查其它缺陷清单可参见:缺陷清单2.20 构建自己的规则集可以构建自己的规则集3 准备使用FindBugsFindBugs目前最新版本是 0.9.3 。文件名是:findbugs-0.9.3.zip(Windows)或findbugs-0.9.3.tar.gz(Unix)。(下载网页)也可以到StarTeam取相应安装文件到本地,将它解压缩到所选的目录中,安装就完成了。 要运行 FindBugs,需要一个版本 1.4 或者更高的 Java Development Kit (JDK)。安装完后,要增加两个环境变量:在 FindBug

12、s 主目录中,有几个值得注意的目录。文档在 doc 目录中,但是对我们来说更重要的是bin 目录,该包含了运行 FindBugs 的批处理文件。4 运行 FindBugs像如今的大多数数工具一样,可以以多种方式运行 FindBugs从 GUI、从命令行、使用 Ant、作为 Eclipse 插件程序和使用 Maven。这里将重点提及从 GUI 运行 FindBugs,简要提及使用Ant 和命令行运行。4.1 FindBugs UI使用 FindBugs UI 很直观。使用 FindBugs UI 的一个好处是对每一个检测到的问题提供了说明,图 1 显示了缺陷 Test的说明。图一:项目Test的

13、缺陷说明对每一种缺陷模式提供了类似的说明。窗口下面的 Source code 选项卡很有用。如果告诉 FindBugs 在什么地方寻找代码,它就会在转换到相应的选项卡时突出显示有问题的那一行。图一中的上部有根据不同类别来检查缺陷的选项,选项有(By Class、By Package、By Bug Type、By Bug Category)。图二是【file】选项,主要功能有:创建新项目、打开/关闭项目、储存项目、储存Bugs信息、装载Buugs信息图三是【View】选项,这些选项很有用,可以切换不同模式的视图。图四是【Settings】选项,是对检测的缺陷模式进行选择。图五是【创建新项目】选项

14、4.2 使用 FindBugs UI步骤第一次使用(1) 依照图五【创建新项目】选项说明,先创建新项目,输入被检查的class或jar路径、java源文件路径及程序运行依赖的class或jar路径(2) 按【FingBugs】按钮开始检查(3) 如果出现下图六的警告说明程序运行依赖的class或jar路径不对或依赖文件不完整,应依据警告信息完善。(4) 按【OK】后即进入上图一的错误信息显示(5) 选择【file】储存新建的项目(6) 选择【file】储存新扫描的Bugs信息(xml文件)非第一次使用(1) 选择【file】装载上次新建的项目并运行(2) 也可以选择【file】装载上次储存的Bugs信息来查看值得一提的还有在将 FinBugs 作为 Ant 任务或者在命令行中运行 FindBugs 时,选择 xml 作为 ouput 选项,可以将上一次运行的结果装载到 UI 中。这样做是同时利用基于命令行的工具和 UI 工

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 机械/制造/汽车 > 汽车技术

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号