Findbugs

1.Eclipse的FindBugs插件

2006-02-07 09:48 bea 我要评论(0)字号:T | T

当我们编写完代码,做完单元测试等各种测试后就提交正式运行,只能由运行的系统来检测我们代码是否有问题了,代码中隐藏的错误在系统运行的过程中被发现后,然后再来进行相应的修改,那么后期修改的代价就相当高了。

AD:

问题提出:

当我们编写完代码,做完单元测试等各种测试后就提交正式运行,只能由运行的系统来检测我们代码是否有问题了,代码中隐藏的错误在系统运行的过程中被发现后,然后再来进行相应的修改,那么后期修改的代价就相当高了。

解决方法:

现在有很多Java代码分析工具,FindBugs中开源项目当中的一个,它可以帮你找到代码中隐藏的一些错误,提升你的代码能力与系统安全可靠性。

安装

JDK:1.5.0 从https://www.360docs.net/doc/1418843256.html,上去下载安装

Eclipse:3.1.1 从https://www.360docs.net/doc/1418843256.html, 上去下载解压

FindBugs:0.9.4 从https://www.360docs.net/doc/1418843256.html,/

官方的文档 https://www.360docs.net/doc/1418843256.html,/manual/

Eclipse plugin for FindBugs version 0.0.17 从 https://www.360docs.net/doc/1418843256.html,/downloads.html 下载

插件管理技巧

提示:新下载的插件PlugIn一定不要都放在原始的Eclipse目录下去。

1.前提是你已经安装好了Eclipse工具了,比如安装在E:\OpenSource\Eclipse\目录下,以下这个目录以%ECLIPSE_HOME%

来进行表示;

2.此时默认的插件是在%ECLIPSE_HOME%\plugins目录中的;

3.在%ECLIPSE_HOME%下建立一个PlugInsNew的目录;

比如:E:\OpenSource\Eclipse\PlugInsNew\

4.你下载了个新的插件,比如叫做:XYZ

那么就在%ECLIPSE_HOME%\PlugInsNew\目录下建立XYZ目录,目录里面是eclipse目录,eclipse目录包含有features 与plugins两个子目录;结构如下图所示:

5.把下载的新插件的文件放在以下相应目录中

%ECLIPSE_HOME%\PlugInsNew\XYZ\eclipse\features

%ECLIPSE_HOME%\PlugInsNew\ XYZ\eclipse\plugins

6.建立相关的.link的文件

然后在%ECLIPSE_HOME%\links目录里建立一个XYZ.link的文件

内容如是:path=E:/OpenSource/Eclipse/PlugInsNew/XYZ就一行这样的路径指示而已。

当然,采用相对路径来表示可能更直观一些,方便进行文件整体移动和小组全部成员的共享命名用,省得移动后要改动Link文件里的绝对路径而费心费力。直接拷贝过去就可以使用。

即XYZ.link文件的内容如是:path=../PlugInsNew/XYZ

这样,如果你下载了多个插件就可以如法炮制建立多个Link文件,想加载哪个插件就把哪个插件的Link文件放

到%ECLIPSE_HOME%\links的目录中即可,使用与管理都很方便,建议千万不要放在默认的安装目录中;

如果你的%ECLIPSE_HOME%与此不同,请修改XYZ.link文件里的路径

7.删除,关闭Eclipse

删除%ECLIPSE_HOME%\links\XYZ.link文件即可

删除%ECLIPSE_HOME%\PlugInsNew\XYZ整个目录及文件

8.重新启动Eclipse即可

使用

重新启动Eclipse后,在Help => About Eclipse SDK => Plug-in Details你可以看到由“FindBugs Project”提供的“FindBugs Plug-in”版本0.0.17插件,如下图所示:

FindBugs的使用方法

FindBugs是一个可以在Java程序中发现Bugs的程序。

它是专门用来寻找处于“Bug Patterns”列表中的代码的。

Bug Patterns指很有可能是错误的代码的实例。

目前FindBugs最高版本0.9.4,不过更新速度很快的,你应当经常上去看看是否有新版本发布。Eclipse plugin for FindBugs 最高版本0.0.17。

系统要求

使用FindBugs至少需要JDK1.4.0以上版本,FindBugs是平台独立的,可以运行于GNU/Linux、Windows、MacOS X等平台上。

运行FindBugs至少需要有256 MB内存,如果你要分析一个很大的项目,那就需要更加多的内存了。

FindBugs独立运行和与Ant结合的详细操作就不介绍了,可以看官方的文档https://www.360docs.net/doc/1418843256.html,/manual/

独立运行的效果图如下:

打开Bug Details视图

Windows => Show View => Other… => FindBugs => BugDetails

在Package Explorer或Navigator视图中,选中你的Java项目,右键,可以看到“Find Bugs”菜单项,子菜单项里有“Find Bugs”和“Clear Bug Markers”两项内容,如下图所示:

我们建立一个简单的测试文件Test.java 内容如下:

public class Test { private String[] name; public String[] getName() { return name; } public void setName(String[] name) { https://www.360docs.net/doc/1418843256.html, = name; } }

我们点中“Find Bugs”,运行时会出现如下进度框:

运行结束后可以在Problems中看到增加了如下的警告信息内容

FindBugs运行后的警告信息内容不仅在Problems视图中显示,而且将标记在源代码标记框中,在源代码编辑器中我们可以看到警告标识,如下图:

当光标指向你的警告信息的代码上面时,就会有相应的错误提示信息,与Eclipse本身的错误或警告信息提示类似。

选中Problems视图里出现的相应问题,就会在代码编辑器里切换到相应的代码上去,方便根据相应的提示信息进行代码的修改。

在Problems视图里,选中相应的问题条目,右键,在弹出的菜单中,可以看到“Show Bug Details”,如下图所示:

点中它,会切换到Bug Details视图上去,显示更加详细的提示信息。

当然,在代码编辑窗口中,点击带有警告提示信息的图标时,也会自动切换到Bud Details窗口去,查看详细的警告信息,如下图所示。

根据这里详细的信息,你可以得到FindBugs为什么会对你的代码报警告信息,及相应的处理办法,根据它的提示,你可以快速方便地进行代码修改。

根据提示,我们将代码修改成如下,再运行就不会报有警告信息了。

public class Test { private String[] name; public String[] getName() { String[] temp = name; return temp; } public void setName(String[] name) { String[] temp = name; https://www.360docs.net/doc/1418843256.html, = temp; } } 配置FindBugs

选择你的项目,右键 => Properties => FindBugs =>

可以配置的信息包括如上图所示的四个选项的相关设置:

1.Run FindBugs Automatically开关

当此项选中后,FindBugs将会在你修改Java类时自动运行,如你设置了Eclipse自动编译开关后,当你修改完Java 文件保存,FindBugs就会运行,并将相应的信息显示出来。

当此项没有选中,你只能每次在需要的时候自己去运行FindBugs来检查你的代码。

2.Minimum priority to report选择项

这个选择项是让你选择哪个级别的信息进行显示,有Low、Medium、High三个选择项可以选择,很类似于Log4J的级别设置啦。比如:

你选择了High选择项,那么只有是High级别的提示信息才会被显示。

你选择了Medium选择项,那么只有是Medium和High级别的提示信息才会被显示。

你选择了Low选择项,那么所有级别的提示信息都会被显示。

3.Enable bug categories选择项

在这里是一些显示Bug分类的选择:

Correctness关于代码正确性相关方面的

Performance关于代码性能相关方面的

Internationalization关于代码国际化相关方面的

Multithreaded correctness关于代码多线程正确性相关方面的

Style关于代码样式相关方面的

Malicious code vulnerability关于恶意破坏代码相关方面的

比如:如果你把Style的检查框去掉不选择中它,那么与Style分类相关的警告信息就不会显示了。其它的类似。

4.Select bug patterns to check for选择项

在这里你可以选择所要进行检查的相关的Bug Pattern条目

可以从Bug codes、Detector name、Detector description中看到相应的是要检查哪些方面的内容,你可以根据需要选择或去掉相应的检查条件。

总结

此插件的功能很不错,可以帮助我们提升Java代码的编写能力,写出更加安全可靠的代码。建议使用或加在Ant里进行持续构建。现在,你可以马上拿出你已经开发的一个项目,检查一下你的代码有没有问题了。

(责任编辑:城尘)

静态代码分析

静态代码分析 一、什么是静态代码分析 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。 在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。统计证明,在整个软件开发生命周期中,30% 至70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。 静态代码分析工具的优势 1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。 2. 帮助代码设计人员更专注于分析和解决代码设计缺陷。 3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。 二、主流Java静态分析工具 Findbugs、checkstyle和PMD都可以作为插件插入eclipse,当然也有单独的工具可以实现他们的功能,比如Findbugs Tool就可以不必插入eclipse就可以使用。 三者的功能如下表: 工具目的检查项 FindBugs 检查.class 基于Bug Patterns概念,查 找javabytecode(.class文件) 中的潜在bug 主要检查bytecode中的bug patterns,如NullPoint空指 针检查、没有合理关闭资源、字符串相同判断错(==, 而不是equals)等 PMD 检查源文件检查Java源文件中的潜在问 题 主要包括: 空try/catch/finally/switch语句块 未使用的局部变量、参数和private方法 空if/while语句 过于复杂的表达式,如不必要的if语句等 复杂类

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

1 FindBugs是什么? FindBugs 是一个java bytecode静态分析工具,它可以帮助java工程师提高代码质量以及排除隐含的缺陷。 FindBugs检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。 有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。FindBugs不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 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() 方法。 2.2 检测:忽略方法返回值 这个检测器查找代码中忽略了不应该忽略的方法返回值的地方。这种情况的一个常见例子是在调用 String 方法时,例如: 1 String aString = "bob"; 2 b.replace('b', 'p'); 3 if(b.equals("pop")) 这个错误很常见。在第 2 行,程序员认为他已经用 p 替换了字符串中的所有 b。确实是这样,但是他忘记了字符串是不可变的。所有这类方法都返回一个新字符串,而从来不会改变消息的接收者。

Findbugs安装和使用说明

Findbugs的安装和使用1 、Findbugs 介绍 1.1 、Findbugs 简介 FindBugs 是一个静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。 1.2 、适用人员 Java开发人员 1.3 、FindBugs能解决的问题 FindBugs能解决的问题,举例如下: (1)代码的正确性检查――空指针例子 (2)代码的健壮性检查――静态类变量没有定义成Final

(3)多线程正确性检查――低效率 (4)性能问题检查――生成冗余的对象 (5)格式问题检查――比较分支的重复代码

2 、Eclipse与MyEclipse安装Findbugs 插件 2.1 概述 因为大家使用的IDE不一致,所以关于Findbugs插件的安装,将分为Eclipse(3.6以上),MyEclipse6.5,以及Myeclipse8.5 三个部分讲解。又因为目前大家使用的MyEclipse版本较低,不能安装较高版本的findbugs插件,只能安装相应的最高版本。 2.2 、Eclipse在线安装 步骤一:如图,选择Install New Software

步骤二:如图,点击Add 步骤三:如图, Name:Findbugs Location: https://www.360docs.net/doc/1418843256.html,/eclipse 步骤四:如图,选中安装项,然后一直“Next”,等待安装完成

2.3 、Eclipse离线安装 把下面的文件解压后放入Eclipse的dropins目录下,再重启Eclipse edu.umd.cs.findbugs.plugin.eclipse_2.0.3.20131122-15020.zip 2.4 、MyEclipse 6.5 安装Findbugs插件 把下面的文件解压后放入MyEclipse6.5的安装目录下的eclipse\plugins下,再重启MyEclipse edu.umd.cs.findbugs.plugin.eclipse_2.0.0.20111220.zip 2.5 、MyEclipse 8.5 安装Findbugs插件 步骤一:将edu.umd.cs.findbugs.plugin.eclipse_2.0.2.20121204.zip文件解压后拷贝到任意目录下,例如D:/plugins目录下。 edu.umd.cs.findbugs.plugin.eclipse_2.0.2.20121204.zip 步骤二:进入MyEclipse安装目录下的 \configuration\org.eclipse.equinox.simpleconfigurator目录,修改https://www.360docs.net/doc/1418843256.html,文件,在最后一行加入: edu.umd.cs.findbugs.plugin.eclipse,1.3.9.20090821,file:/D:/plugins/edu.umd.cs.findb ugs.plugin.eclipse_2.0.2.20121204,4,false (注意黄色高亮部分的地址需要一致) 步骤三:重启MyEclipse 2.6 、验证安装是否成功 右击项目,出现如下图所示,则安装成功

Findbugs使用简介

Findbugs使用简介 Findbugs是一个在java程序中查找bug的程序,它查找bug模式的实例,也就是可能出错的代码实例,注意Findbugs是检查java字节码,也就是*.class文件。其实准确的说,它是寻找代码缺陷的,很多我们写的不好的地方,可以优化的地方,它都能检查出来。例如:未关闭的数据库连接,缺少必要的null check,多余的null check,多余的if后置条件,相同的条件分支,重复的代码块,错误的使用了"==",建议使用StringBuffer代替字符串连加等等。而且我们还可以自己配置检查规则(做哪些检查,不做哪些检查),也可以自己来实现独有的校验规则(用户自定义特定的bug模式需要继承它的接口,编写自己的校验类,属于高级技巧)。 Findbugs是一个静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。Findbugs自带检测器,其中有60余种Bad practice,80余种Correctness,1种Internationalization,12种Malicious code vulnerability,27种Multithreaded correctness,23种Performance,43种Dodgy。 Bad practice 坏的实践 一些不好的实践,下面列举几个: HE:类定义了equals(),却没有hashCode();或类定义了equals(),却使用 Object.hashCode();或类定义了hashCode(),却没有equals();或类定义了hashCode(),却使用Object.equals();类继承了equals(),却使用Object.hashCode()。 SQL:Statement 的execute方法调用了非常量的字符串;或Prepared Statement是由一个非常量的字符串产生。 DE:方法终止或不处理异常,一般情况下,异常应该被处理或报告,或被方法抛出。 Correctness 一般的正确性问题 可能导致错误的代码,下面列举几个:

Java静态检测工具的简单介绍 - Sonar、Findbugs

Java静态检测工具的简单介绍- Sonar、Findbugs 2010-11-04 13:55:54 标签:sonar休闲职场 Java静态检测工具的简单介绍 from: https://www.360docs.net/doc/1418843256.html,/?p=9015静态检查:静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人 工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。 代码检查代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和 设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代 码结构的合理性等方面;可以发现违背程序编写标准的问题,程序中不安全、 不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题, 包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构 检查等内容。”。看了一系列的静态代码扫描或者叫静态代码分析工具后, 总结对工具的看法:静态代码扫描工具,和编译器的某些功能其实是很相似的, 他们也需要词法分析,语法分析,语意分析...但和编译器不一样的是他们可 以自定义各种各样的复杂的规则去对代码进行分析。 静态检测工具: 1.PMD 1)PMD是一个代码检查工具,它用于分析 Java 源代码,找出潜在的问题: 1)潜在的bug:空的try/catch/finally/switch语句 2)未使用的代码:未使用的局部变量、参数、私有方法等 3)可选的代码:String/StringBuffer的滥用

4)复杂的表达式:不必须的if语句、可以使用while循环完成的for循环 5)重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs 2)PMD特点: 1)与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在 不运行Java程序的情况下报告错误。 2)PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许 多问题 3)用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。 3)同时,PMD已经与JDeveloper、Eclipse、jEdit、JBuilder、BlueJ、 CodeGuide、NetBeans、Sun JavaStudio Enterprise/Creator、 IntelliJ IDEA、TextPad、Maven、Ant、Gel、JCreator以及Emacs 集成在一起。 4)PMD规则是可以定制的: 可用的规则并不仅限于内置规则。您可以添加新规则: 可以通过编写 Java 代码并重新编译 PDM,或者更简单些,编写 XPath 表 达式,它会针对每个 Java 类的抽象语法树进行处理。 5)只使用PDM内置规则,PMD 也可以找到你代码中的一些真正问题。某些问题可能 很小,但有些问题则可能很大。PMD 不可能找到每个 bug,你仍然需要做单元测 试和接受测试,在查找已知 bug 时,即使是 PMD 也无法替代一个好的调试器。

Eclipse 插件 FindBugs 使用手册

Eclipse 插件FindBugs 使用手册 前言: 本文介绍如何利用Eclipse 插件FindBugs 优化Java 代码。 本插件是本人在对系统进行代码优化的时候,向迟焕祺同事索取并学习使用的,现在把工具的一些使用方法与大家共享,并把FindBugs提供给大家! 感谢迟哥提供良好资源供大家学习、使用! 问题提出: 当我们编写完代码,做完单元测试等各种测试后就提交正式运行,只能由运行的系统来检测我们代码是否有问题了,代码中隐藏的错误在系统运行的过程中被发现后,然后再来进行相应的修改,那么后期修改的代价就相当高了。 解决方法: 现在有很多Java 代码分析工具,FindBugs 中开源项目当中的一个,它可以帮你找到代码中隐藏的一些错误,提升你的代码能力与系统安全可靠性。 FindBugs 介绍 FindBugs 是一个可以在Java 程序中发现Bugs 的程序。它是专门用来寻找处于“Bug Patterns”列表中的代码的。Bug Patterns 指很有可能是错误的代码的实例。 原文:FindBugs is a program to find bugs in Java programs. It looks for instances of "bug patterns" --- code instances that are likely to be errors. 使用FindBugs 至少需要JDK1.4.0 以上版本,FindBugs是平台独立的,可以运行于GNU/Linux、Windows、MacOS X 等平台上。运行FindBugs 至少需要有256 MB 内存,如果你要分析一个很大的项目,那就需要更加多的内存了。 获取FindBugs 最新版本:https://www.360docs.net/doc/1418843256.html,/projects/findbugs/files/ FinBugs 介绍:https://www.360docs.net/doc/1418843256.html,/manual/ Eclipse 插件links 文件夹方式配置: 提示:直接的插件配置方式是使用Eclipse 的Update 方式更新,或者把新下载的插件PlugIn 放在原始的Eclipse 目录下去,这种方式会随着插件的增多而导致插件维护工作量的增加。鉴于上述原因,可以使用links 文件夹的方式进行配置。(MyEclipse 插件就是 使用links 的方式进行配置的)配置方式如下: 1. 安装好Eclipse 工具,可以到https://www.360docs.net/doc/1418843256.html, 上下载压缩包。比如安装在E:\OpenSource\Eclipse\目录下,以下这个目录以%ECLIPSE_HOME%来进行表示; 2. 此时默认的插件是在%ECLIPSE_HOME%\plugins目录中的; 3. 在%ECLIPSE_HOME%下建立一个PlugInsNew的目录; 比如:E:\OpenSource\Eclipse\PlugInsNew 4. 你下载了个新的插件,比如叫做:XYZ 那么就在%ECLIPSE_HOME%\PlugInsNew\目录下建立XYZ目录,目录里面是eclipse 目录,eclipse 目录包含有features与plugins两个子目录;结构如下图所示:

FindBugs使用手册教案资料

文件编号: 配置项编号: FindBugs使用手册 文档版本号 V 1.0 农信银资金清算中心创新研发部

文档修订记录

目录 1、FindBugs简介 (3) 2、FindBugs的检查规则 (4) 2.1Correctness(正确性) (4) 2.2 Bad practice(不良实践) (5) 2.3 Performance(性能) (5) 2.4Multithreaded correctness(多线程正确性) (6) 2.5 Dodgy(不可靠) (7) 3、FindBugs使用 (8) 3.1安装FindBugs (8) 3.2配置FindBugs (8) 3.3使用FindBugs (8) 1、FindBugs简介 FindBugs是用于java代码检查的一种静态分析工具,它检查类或者JAR 文件,将字节

码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。 FindBugs专注于找出潜在程序错误,而不是编码风格问题,目的在于提高程序的健壮性。 2、FindBugs的检查规则 FindBugs提出了超过200种规则,这些规则可主要分为如下类别: 2.1Correctness(正确性) 这些问题涉及到可能在某些方面不正确的代码。如:代码有无限递归,或者读取为写入的字段,这类问题几乎无疑是程序的错误。 例1:使用未初始化的类成员,可能导致NullPointException 代码: FindBugs检测结果: 例2:不使用方法的返回值 代码: FindBugs检测结果:

findbugs检测提示详解

findbugs检测提示详解 1、Comparison of String objects using == or != 例,override equals方法时容易犯错 if(this.topic != key.getTopic()) return false; 2、Dead store to newStatusRecord 定义局部变量后没有引用 3、Invocation of toString on values 直接调用数组的toString方法 public Query createQuery(String hql, Object values[],Session session){ logger.debug(values); logger.debug((new StringBuilder()).append("hql=[").append(hql).append("] ").append(((Object) } 正确的例子,调用Arrays.toString()和Arrays.deepToString()方法。import java.util.Arrays; class A{ } class B{ @Override public String toString() { return "BBBBB"; } }

public class Test { public static void main(String[] args) { Object [] a = {new Integer(0),new Boolean(true),true,new A(),new B()}; Object[][]b ={{new A(),new B()},{new A(),new B()},{new A(),new B()}}; System.out.println(Arrays.deepToString(b)); } } 4、ignores exceptional return value of java.io.File.mkdirs() 忽略了返回值,应当含有返回值 public void initFolder() { if (!exitDir.isDirectory()) { exitDir.mkdirs(); https://www.360docs.net/doc/1418843256.html,("===Finishing create exit trade image folder!===="); } } This method returns a value that is not checked. The return value should be checked since it can indicate an unusual or unexpected function execution. For example, the File.delete() method returns false if the file could not be successfully deleted (rather than throwing an Exception). If you don't check the result, you won't notice if the method invocation signals unexpected behavior by returning an atypical return value. 5、不使用new String()定义空的字符串 String alarmCodeCond = new String(); 应当 String alarmCodeCond = "";

跟我学Java代码质量检测FindBugs工具——如何下载和安装FindBugs检测工具

1.1跟我学Java代码质量检测FindBugs工具——如何下载和安装FindBugs 检测工具 1.1.1应用代码检测工具的必要性 1、应用代码检测工具的必要性 随着软件工程项目越来越复杂和技术应用的不断深入,软件工程项目将变得越来越庞大。此时,如果仅仅依靠人工去检查软件项目中的程序代码内所可能存在的各种潜在问题是不现实的,即使实施单元测试过程,也是无法完全覆盖和及时地发现出相关的问题,因此借助自动化的程序代码质量检测工具去完成对代码的检查工作是十分必要的。 提高软件系统中的程序代码质量不仅仅要求开发人员遵守一定的编程规范,也还要能够通过各种手段和工具及时地发现出隐藏在软件系统程序代码中的各种错误,而依赖人工在很多场合下都是比较难发现出这些问题或者错误的。因此,开发人员有必要借助一定的检测工具提高对系统代码检测的效率。 目前在J2EE的开源领域中,针对Eclipse IDE开发工具提供有许多Eclipse 插件,能够帮助开发人员在“编码标准”、“代码重复度”、“代码覆盖率”和“包之间的依赖性”等方面进行具体的度量和检测。 2、FindBugs 是一个静态分析工具 FindBugs 是由马里兰大学提供的一款开源Java静态代码分析工具,它检查类或者JAR 文件,将字节码(FindBugs其实就是对编译后的class文件进行扫描,藉以发现一些隐藏的Bug)与一组缺陷模式进行对比以发现可能的问题。开发人员一旦有了静态分析工具,就可以在不实际运行程序的情况下对所编写的程序代码进行分析和检测,随时发现出相关的问题,从而提高程序代码的质量。 FindBugs检测工具可以发现出的问题主要包括:多线程竞争问题、性能问题、安全问

FindBugs安装及配置使用说明

FindBugs插件安装及配置使用说明 目录 FindBugs插件安装及配置使用说明 (1) 用途 (1) 安装 (1) 配置 (2) 运行 (3) 其他说明 (8) 额外收获 (10) 用途 FindBugs 是一个java bytecode静态分析工具,它可以帮助java工程师提高代码质量以及排除隐含的缺陷,以期尽可能在项目的初始阶段将代码问题解决。 FindBugs检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。 有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。FindBugs不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用Visitor 模式进行分析。 安装 1.打开eclipse. Help > Software Updates ->Find and Install. 选择Search for new features to install. >next > New Remote Site… 在对话框里填写如下: Name: findbugs. URL: https://www.360docs.net/doc/1418843256.html,/eclipse >确定 选中findbugs >Finish 2. 在新出来的对话框中,选中findbugs(注意: 此时如果装了Myeclipse插件, 这里可能会报 错. 请先在eclipse的links文件夹下面将Myeclipse的link文件移除, 然后等findbugs

装完之后, 再将Myeclipse的link文件放进来) >next 选中”I accept the terms in the license agreement” >Next >Finish >Install >Yes (重启eclipse) findbugs 安装完成 配置 1.打开FindBugs视图: Windows => Show View => Other… => FindBugs => Bug Info 、Bug Explorer、Bug Reviews 2.配置FindBugs 选择你的项目=>右键=> Properties => FindBugs => 选中”run findbugs automatically”=> OK

用Eclipse自带插件创建自定义findbugs检测器

用Eclipse自带插件创建findbugs的检测器 1.准备工作 1.1.为Eclipse安装插件 插件1:ByteCode下载地址:http://andrei.gmxhome.de/eclipse/ 用法:在Eclipse菜单栏上单击windows->show view->other…->Java->Bytecode即可打开Bytecode窗口,方便查看当前文件的字节码,效果如图1所示。 图1 插件2:Findbugs下载地址:https://www.360docs.net/doc/1418843256.html,/eclipse 用法:在Eclipse菜单栏上单击windows->show view->other…->Findbugs->Bug Explorer即可打开Bug Explorer窗口,进入Findbugs浏览状态,效果如图2所示。

图2 1.2.以下操作需要用的软件(可选) 为了操作方便,建议使用winRAR用来打开jar文件;使用Notepad++打开xml 文件 2.创建自己的Findbugs检测器 2.1.编写自定义的检测器Detector 项目中需要引入Findbugs的jar文件:findbugs.jar 自定义的检测器需要继承OpcodeStackDetector,重写其sawOpcode方法。下面这个检查器Detector用来查找项目中有没有System.out和System.error情况出 现。

public ForbiddenSystemOutClass(BugReporter bugReporter) { this.bugReporter = bugReporter; } /** * visit方法,在每次进入字节码方法的时候调用在每次进入新方法的时候清空标志位 */ @Override public void visit(Code obj) { super.visit(obj); } /** * 每扫描一条字节码就会进入sawOpcode方法 * * @param seen 字节码的枚举值 */ @Override public void sawOpcode(int seen) { if (seen == GETSTATIC) { if (getClassConstantOperand().equals("java/lang/System")// get class mapping && (getNameConstantOperand().equals("out") // get static field mapping || getNameConstantOperand().equals("err"))) { BugInstance bug = new BugInstance(this, "CHECK_SYSTEMCLASS", NORMAL_PRIORITY).addClassAndMethod(this).addSourceLine( this, getPC()); bug.addInt(getPC()); bugReporter.reportBug(bug); } } } } 文件1:自定义检测器ForbiddenSystemOutClass.java 接下来找到Eclipse编译的ForbiddenSystemOutClass.class文件,一般在项目的lib目录里可以找到。将其放入findbugs-plugin.jar文件中对应的目录下。 2.2.修改findbugs.xml文件 找到Eclipse插件安装文件夹中findbugs-plugin.jar所在的文件夹,我的文件夹是F:\eclipse\plugins\edu.umd.cs.findbugs.plugin.eclipse_2.0.0.20111221双击打开findbugs-plugin.jar文件,找到其中的findbugs.xml和messages.xml两个文件,如图3所示。

代码格式检查

几种工具的对比 FindBugs FindBugs 大多数提示有用,值得改 1. 配置无查找功能,不过缩写能让我们很快找到某个规则 2. 提供图形界面的独立程序,对jar进行检测,有报告生成,非常方便 3. 很多功能插件没有实现,可独立使用FindBugs,但没法同时修改源码 插件bug替代法: 使用独立的FindBugs设置规则,然后到C:\Documents and Settings\XXX\下找.Findbugs_prefs,然后改名覆盖Eclipse Project下的.fbprefs (先关闭你的Project) PMD 比较严格 1. 独立的程序是命令行形式操作 2. 插件可以配置规则,有独立显示问题的视图,也很方便

3. 一般来说,需要自定义规则才通过检验 过于严格 1. 按照Sun的规范太严格了,需要自定义规则 2. 插件自定义规则没有查找功能,查找规则麻烦 3. 只能做检查,不能修改代码,可配合Jalopy使用修改代码 可参考以下文档进行学习使用: CheckStyle 过于严格 1. 按照Sun的规范太严格了,需要自定义规则 2. 插件自定义规则没有查找功能,查找规则麻烦 3. 只能做检查,不能修改代码,可配合Jalopy使用修改代码 参考:https://www.360docs.net/doc/1418843256.html,/question/129540_23043 工具的插件安装 PMD PMD检查原理 PMD的核心是JavaCC解析器生成器。PMD结合运用JavaCC和EBNF(扩展巴科斯-诺尔范式,Extended Backus-Naur Formal)语法,再加上JJTree,把Java源代码解析成抽象语法树(AST,Abstract Syntax Tree)。显然,这句话不那么好懂,且看下文具体说明。 从根本上看,Java源代码只是一些普通的文本。不过,为了让解析器承认这些普通的文本是合法的Java代码,它们必须符合某种特定的结构要求。这种结构可以用一种称为EBNF 的句法元语言表示,通常称为“语法”(Grammar)。JavaCC根据语法要求生成解析器,这个解析器就可以用于解析用Java编程语言编写的程序。 不过实际运行中的PMD还要经过JJTree的一次转换。JJTree是一个JavaCC的插件,通过AST扩充JavaCC生成的解析器。AST是一个Java符号流之上的语义层。有了JJTree,语法分析的结果不再是“System, ., out, ., . println”之类的符号序列,而是一个由对象构成的树型层次结构。

Findbugs安装及使用说明1

安装 1.打开eclipse. 2.Help > Software Updates ->Find and Install. 3.选择Search for new features to install. 4.>next 5.> New Remote Site… 6.在对话框里填写如下: ?Name: findbugs. ?URL: https://www.360docs.net/doc/1418843256.html,/eclipse 7.>确定 8.选中findbugs 9.>Finish 10.在新出来的对话框中,选中findbugs(注意: 此时如果装了Myeclipse插件, 这 里可能会报错. 请先在eclipse的links文件夹下面将Myeclipse的link文件移除, 然后等findbugs装完之后, 再将Myeclipse的link文件放进来) 11.>next 12.选中”I accept the terms in the license agreement” 13.>Next 14.>Finish 15.>Install 16.>Yes (重启eclipse) 17.f indbugs安装完成 使用 1. 打开Bug Details和bug Explorer视图: Windows => Show View => Other… => FindBugs => BugDetails和bug Explorer

2. 配置FindBugs选择你的项目=>右键=> Properties => FindBugs => 选 中”run findbugs automatically”=> OK 第2步的作用: 当你修改完Java文件保存,FindBugs就会运行,并将相应的信息显示出来。当此项(”run findbugs automatically”)没有选中,你只能每次在需要的时候自己去运行(选择你的项目=>右键=>Find Bugs => Find Bugs )FindBugs来检查你的代码。 3. 当findBugs运行后,就可以在bug Explorer视图中看到相应的信息,可以双击切换 到相应代码,就可以对这个代码改进了,如下图: 4. 展开bug Explorer视图中的BUG分类,双击某个BUG项,显示对应的BUG代码, 如下图: 这时我们就可以找到BUG所在并修改之,这里是NP的BUG,应该改为: if (user == null || StringUtil.isBlank(user.getIwUserId())) { return null; } 5. 点击BUG所在行行号前的BUG标志,会在BUG detail视图中显示详细的BUG说 明及该BUG的ID(下图的”[NP]”),如下图:

淘测试

淘测试 静态检查:静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人 工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。 代码检查代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和 设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代 码结构的合理性等方面;可以发现违背程序编写标准的问题,程序中不安全、 不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题, 包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构 检查等内容。”。看了一系列的静态代码扫描或者叫静态代码分析工具后, 总结对工具的看法:静态代码扫描工具,和编译器的某些功能其实是很相似的, 他们也需要词法分析,语法分析,语意分析...但和编译器不一样的是他们可

以自定义各种各样的复杂的规则去对代码进行分析。静态检测工具:PMD 1)PMD是一个代码检查工具,它用于分析Java 源代码,找出潜在的问题: 1)潜在的bug:空的try/catch/finally/switch语句 2)未使用的代码:未使用的局部变量、参数、私有方法等 3)可选的代码:String/StringBuffer的滥用 4)复杂的表达式:不必须的if语句、可以使用while 循环完成的for循环 5)重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs 2)PMD特点: 1)与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在 不运行Java程序的情况下报告错误。 2)PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许 多问题 3)用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。3)同时,PMD已经与JDeveloper、Eclipse、jEdit、JBuilder、BlueJ、 CodeGuide、NetBeans、Sun JavaStudio Enterprise/Creator、

eclipse代码缺陷查找插件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,来发现这种

FindBugs错误类型对照表

IMSE_DONT_CATCH_https://www.360docs.net/doc/1418843256.html,=不良实践- 捕获可疑IllegalMonitorStateException BX_BOXING_IMMEDIATELY_https://www.360docs.net/doc/1418843256.html,=性能- 基本类型包装之后立刻解包 IJU_SETUP_NO_https://www.360docs.net/doc/1418843256.html,=使用错误- TestCase定义的setUp没有调用super.setUp() TQ_ALWAYS_VALUE_USED_WHERE_NEVER_https://www.360docs.net/doc/1418843256.html,=使用错误- 某个值使用了注解限制类型,但是这个限制永远不会发生 TLW_TWO_LOCK_https://www.360docs.net/doc/1418843256.html,=多线程错误- 等待两个被持有的锁 RV_01_TO_https://www.360docs.net/doc/1418843256.html,=使用错误- 0至1的随机数被当做整数0 NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_https://www.360docs.net/doc/1418843256.html,=高危- 参数必须非null但是标记为可为null RV_ABSOLUTE_VALUE_OF_RANDOM_https://www.360docs.net/doc/1418843256.html,=使用错误- 尝试计算32位随机整数的绝对值 EC_INCOMPATIBLE_ARRAY_https://www.360docs.net/doc/1418843256.html,=使用错误- 使用equals()比较不兼容的数组 UL_UNRELEASED_LOCK_EXCEPTION_https://www.360docs.net/doc/1418843256.html,=多线程错误- 方法没有在所有异常路径释放锁 SE_NONSTATIC_https://www.360docs.net/doc/1418843256.html,=不良实践- serialVersionUID不是static的 UCF_USELESS_CONTROL_https://www.360docs.net/doc/1418843256.html,=高危- 无用控制流 BC_IMPOSSIBLE_https://www.360docs.net/doc/1418843256.html,=使用错误- 不可能的转换 XSS_REQUEST_PARAMETER_TO_SEND_https://www.360docs.net/doc/1418843256.html,=安全风险- servlet的反射导致跨站脚本漏洞 DM_NEW_FOR_https://www.360docs.net/doc/1418843256.html,=性能- 仅为了获得一个方法就创建了一个对象 OBL_UNSATISFIED_https://www.360docs.net/doc/1418843256.html,=试验- 方法可能在清理流或资源时失败 UW_UNCOND_https://www.360docs.net/doc/1418843256.html,=多线程错误- 无条件等待 DLS_DEAD_LOCAL_STORE_OF_https://www.360docs.net/doc/1418843256.html,=高危- 把null设置给不会用到的局部变量 NM_CLASS_NAMING_https://www.360docs.net/doc/1418843256.html,=类名应该以大写字母开头 RC_REF_COMPARISON_BAD_PRACTICE_https://www.360docs.net/doc/1418843256.html,=使用错误- 怀疑对两个布尔值的引用进行比较

相关文档
最新文档