java代码缺陷自动分析工具_第1页
java代码缺陷自动分析工具_第2页
java代码缺陷自动分析工具_第3页
java代码缺陷自动分析工具_第4页
java代码缺陷自动分析工具_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、FindBugs 是什么?FindBugs是一个java bytecode静态分析工具,它可以帮助java工程师提高代码质量以及 排除隐含的缺陷。FindBugs检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。FindBugs不是通过分 析类文件的形式或结构来确定程序的意图,而是通常使用 Visitor 模式进行分析。FindBugs 可以做什么?FindBugs 提供了 35个检测器来检测字节码中可能的缺陷。可以做的事情主要有:找出 hash equals 不匹配找与 equals() 和 hashCode(

2、) 的实现相关的几个问题。这两个方法非常重要,因为几乎所 有基于集合的类-List、Map、Set 等都调用它们。一般来说,这个检测器寻找两种不同类 型的问题:当一个类重写对象的 equals() 方法,但是没有重写它的 hashCode 方法,或者相反的情 况时。定义一个 co-variant 版本的 equals() 或 compareTo() 方法。例如, Bob 类定义其 equals() 方法为布尔 equals(Bob) ,它覆盖了对象中定义的 equals() 方法。因为 Java 代 码在编译时解析重载方法的方式,在运行时使用的几乎总是在对象中定义的这个版本的方法, 而不是在

3、Bob 中定义的那一个(除非显式将 equals() 方法的参数强制转换为 Bob 类型)。 因此,当这个类的一个实例放入到类集合中的任何一个中时,使用的是 Object.equals() 版 本的方法,而不是在 Bob 中定义的版本。在这种情况下, Bob 类应当定义一个接受类型为 Object 的参数的 equals() 方法。检测:忽略方法返回值 这个检测器查找代码中忽略了不应该忽略的方法返回值的地方。这种情况的一个常见例子是 在调用 String 方法时,例如:String aString = bob;b.replace(b, p);if(b.equals(pop)这个错误很常见。在第

4、2行,程序员认为他已经用p替换了字符串中的所有b。确实是这 样,但是他忘记了字符串是不可变的。所有这类方法都返回一个新字符串,而从来不会改变 消息的接收者。检测:Null指针对null的解引用(dereference)和冗余比较 这个检测器查找两类问题。它查找代码路径将会或者可能造成 null 指针异常的情况,它还 查找对null的冗余比较的情况。例如,如果两个比较值都为null,那么它们就是冗余的并 可能表明代码错误。FindBugs在可以确定一个值为null而另一个值不为null时,检测类 似的错误,例如:Person person = aMap.get(bob);if (person !

5、= null) person.updateAccessTime();String name = person.getName();在这个例子中,如果第1行的Map不包括一个名为“bob”的人,那么在第5行询问person 的名字时就会出现null指针异常。因为FindBugs不知道map是否包含“bob”,所以它将 第 5 行标记为可能 null 指针异常。检测:初始化之前读取字段 这个检测器寻找在构造函数中初始化之前被读取的字段。这个错误通常是由使用字段名而不 是构造函数参数引起的,例如在构造函数中读取未初始化的字段:public class Thing private List actio

6、ns;public Thing(String startingActions) StringTokenizer tokenizer = new StringTokenizer(startingActions);while (tokenizer.hasMoreTokens() actions.add(tokenizer.nextToken();在这个例子中,第 6 行将产生一个 null 指针异常,因为变量 actions 还没有初始化。命名检查对标准 Java 命令规范的测试:变量名称不应太短;方法名称不应过长;类名称应当以小写 字母开头;方法和字段名应当以小写字母开头,等等。未使用的代码检查

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

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

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

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

11、JDK)。安装完后,要增加两个环境变量:FINDBUGS_HOME,例如:FINDBUGS_HOME =D:findbugs-0.9.3JAVA_HOME,例如:JAVA_HOME=D:j2sdkl.4.2_O6在 FindBugs 主目录中,有几个值得注意的目录。文档在 doc 目录中,但是对我们来说更重 要的是 bin 目录,该包含了运行 FindBugs 的批处理文件。运行 FindBugs像如今的大多数数工具一样,可以以多种方式运行FindBugs从GUI、从命令行、使用 Ant、作为Eclipse插件程序和使用Maven。这里将重点提及从GUI运行FindBugs,简要提及使用Ant

12、和命令行运行。FindBugs UI使用 FindBugs UI 很直观。使用 FindBugs UI 的一个好处是对每一个检测到的问题提供了 说明,图 1 显示了缺陷 Test 的说明。图一:项目 Test 的缺陷说明对每一种缺陷模式提供了类似的说明。窗口下面的 Source code 选项卡很有用。如果告诉 FindBugs 在什么地方寻找代码,它就会在转换到相应的选项卡时突出显示有问题的那一行图一中的上部有根据不同类别来检查缺陷的选项,选项有(By Class、By Package、By Bug Type、 By Bug Category)。图二是【file】选项,主要功能有:创建新项目

13、、打开/关闭项目、储存项目、储存Bugs信 息、装载 Buugs 信息图三是【View】选项,这些选项很有用,可以切换不同模式的视图。图四是【Settings】选项,是对检测的缺陷模式进行选择。图五是【创建新项目】选项使用 FindBugs UI 步骤 第一次使用(1)依照图五【创建新项目】选项说明,先创建新项目,输入被检查的 class 或 jar路径、java源文件路径及程序运行依赖的class或jar路径(2)按【FingBugs】按钮开始检查(3)如果出现下图六的警告说明程序运行依赖的class或jar路径不对或依赖文件不完整,应依据警告信息完善。(4)按【0K】后即进入上图一的错误信

14、息显示(5)选择【file】储存新建的项目(6)选择【file】储存新扫描的Bugs信息(xml文件)非第一次使用(1)选择【file】装载上次新建的项目并运行(2)也可以选择【file】装载上次储存的Bugs信息来查看值得一提的还有在将 FinBugs 作为 Ant 任务或者在命令行中运行 FindBugs 时,选择 xml 作为ouput选项,可以将上一次运行的结果装载到UI中。这样做是同时利用基于命令行的 工具和 UI 工具的优点的一个很好的方法。FindBugs 作为 Ant 任务如何在Ant编译脚本中使用FindBugs?首先将FindBugs Ant任务拷贝到Ant的lib目 录中

15、,这样 Ant 就知道新的任务。将 FIND_BUGS_HOMElibFindBugs-ant.jar 拷贝到 ANT_HOMElib。现在看看在编译脚本中要加入什么才能使用 FindBugs 任务。因为 FindBugs 是一个自定义 任务,将需要使用 taskdef 任务以使 Ant 知道装载哪一个类。通过在编译文件中加入以下一行: 在定义了 taskdef 后,可以用它的名字 FindBugs 引用它。下一步要在编译中加入使用新任 务的目标,示例如下:第 1 行: 注意 target 取决于编译。一定要记住处理的是类文件而 不 是源文件,这样使target对应于编译目标保证了 FindB

16、ugs可在最新的类文件运行。FindBugs可以灵活地接 受多种输入,包括一组类文件、JAR文件、或者一组目录。第 2 行:必须指定包含 FindBugs 的目录,我是用 Ant 的一个属性完成的,像这样:可选属性 output 指定 FindBugs 的结果使用的输出格式。可能的值有 xml 、 text 或者emacs 。如果没有指定 outputFile ,那么 FindBugs 会使用标准输出。如前所述, XML 格 式有可以在 UI 中观看的额外好处。第3行:class元素用于指定要FindBugs分析哪些JAR、类文件或者目录。分析多个JAR 或者类文件时,要为每一个文件指定一个单独的 class 元素。除非加入了 projectFile 元 素,否则需要 class 元素。第 4 行: 用嵌套元素 auxClasspath 列出应用程序的依

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论