Bad practice 坏的实践
一些不好的实践,下面列举几个:
HE: 类定义了equals(),却没有hashCode();或类定义了equals(),却使用
Object.hashCode();或类定义了hashCode(),却没有equals();或类定义了hashCode(),却使用Object.equals();类继承了equals(),却使用Object.hashCode()。
SQL:Statement 的execute方法调用了非常量的字符串;或Prepared Statement是由一个非常量的字符串产生。
DE: 方法终止或不处理异常,一般情况下,异常应该被处理或报告,或被方法抛出。
Correctness 一般的正确性问题
可能导致错误的代码,下面列举几个:
NP: 空指针被引用;在方法的异常路径里,空指针被引用;方法没有检查参数是否null;null值产生并被引用;null值产生并在方法的异常路径被引用;传给方法一个声明为@NonNull的null参数;方法的返回值声明为@NonNull实际是null。
Nm: 类定义了hashcode()方法,但实际上并未覆盖父类Object的hashCode();类定义了tostring()方法,但实际上并未覆盖父类Object的toString();很明显的方法和构造器混淆;方法名容易混淆。
SQL:方法尝试访问一个Prepared Statement的0索引;方法尝试访问一个ResultSet的0索引。
UwF:所有的write都把属性置成null,这样所有的读取都是null,这样这个属性是否有必要存在;或属性从没有被write。
Internationalization 国际化
当对字符串使用upper或lowercase方法,如果是国际的字符串,可能会不恰当的转换。
Malicious code vulnerability 可能受到的恶意攻击
如果代码公开,可能受到恶意攻击的代码,下面列举几个:
FI: 一个类的finalize()应该是protected,而不是public的。
MS:属性是可变的数组;属性是可变的Hashtable;属性应该是package protected的。
Multithreaded correctness 多线程的正确性
多线程编程时,可能导致错误的代码,下面列举几个:
ESync:空的同步块,很难被正确使用。
MWN:错误使用notify(),可能导致IllegalMonitorStateException异常;或错误的
使用wait()。
No: 使用notify()而不是notifyAll(),只是唤醒一个线程而不是所有等待的线程。
SC: 构造器调用了Thread.start(),当该类被继承可能会导致错误。
Performance 性能问题
可能导致性能不佳的代码,下面列举几个:
DM:方法调用了低效的Boolean的构造器,而应该用Boolean.valueOf(…);用类似
Integer.toString(1) 代替new Integer(1).toString();方法调用了低效的float的构造器,应该用静态的valueOf方法。
SIC:如果一个内部类想在更广泛的地方被引用,它应该声明为static。
SS: 如果一个实例属性不被读取,考虑声明为static。
UrF:如果一个属性从没有被read,考虑从类中去掉。
UuF:如果一个属性从没有被使用,考虑从类中去掉。
Dodgy 危险的
具有潜在危险的代码,可能运行期产生错误,下面列举几个:
CI: 类声明为final但声明了protected的属性。
DLS:对一个本地变量赋值,但却没有读取该本地变量;本地变量赋值成null,却没有读取该本地变量。
ICAST: 整型数字相乘结果转化为长整型数字,应该将整型先转化为长整型数字再相乘。
INT:没必要的整型数字比较,如X <= Integer.MAX_VALUE。
NP: 对readline()的直接引用,而没有判断是否null;对方法调用的直接引用,而方法可能返回null。
REC:直接捕获Exception,而实际上可能是RuntimeException。
ST: 从实例方法里直接修改类变量,即static属性。
1、和Ant配合使用
从http://findbugs.sourceforge.net/downloads.html下载最新版本的Findbugs,目前的版本是1.3.0, 于2007年11月8日发布。把解压后目录复制到项目的lib目录下,然后就可以和Ant配合使用了。FindBugs工作在j2se1.4.0或以后的版本中,需要至少256MB内存。
在Ant脚本中,首先定义Findbugs的解压目录位置:
<path id="findbugs.path" >
<fileset dir ="${lib.home}/findbugs-1.3.0">
<include name ="**/*.jar"/>
</fileset>
</path>
接着声明Findbugs任务:
<taskdef name="findbugs"
classname="edu.umd.cs.findbugs.anttask.FindBugsTask"
classpathref ="findbugs.path"/>
然后建立Findbugs任务:
<property name ="findbugs.home" value ="${lib.home}/findbugs-1.3.0"/>
<!-- 定义findbugs的home,findbugs的task要使用 -->
<target name ="findbugs">
<findbugs home ="${findbugs.home}" includeFilter="${findbugs_include_filter}"
excludeFilter="${findbugs_exclude_filter}"
jvmargs="-Xmx384m" output ="html"
outputFile ="d:\test.html">
<class location ="${build.home}/WEB-INF/classes/"/>
<!-- 以上定义findbugs查找的类路径 -->
<auxClasspath path="${lib.home}/findbugs-1.3.0/lib/findbugs-ant.jar"/>
<auxClasspath>
<fileset dir="${build.home}/WEB-INF/lib" includes="**/*.jar" />
</auxClasspath>
<!-- 以上定义上述类所依赖的类路径 -->
<sourcePath path ="${src.home}"/>
<!-- 以上定义源代码的路径 -->
</findbugs >
</target >
最后运行ant findbugs即可。
2、Eclipse插件
在Eclipse当中安装Findbugs插件和安装CheckStyle一样,可以参照以下五个步骤进行:
a. 在Eclipse当中分别打开一下菜单 Help->Software Updates->Find and Install
b. 选择 Search for new features to install 选项然后点击 Next
c. 新建一个 New Remote Site...
d. 输入名称(比如:Findbugs Plug-in)和下面的URL:http://findbugs.cs.umd.edu/eclipse
e. 开始安装
安装好Findbugs以后,选择Windows -> Show View -> Other… -> FindBugs -> BugDetails打开Bug Details视图。
然后在Package Explorer或Navigator视图中,选中你的Java项目,点击右键,可以看到“Find Bugs”菜单项,子菜单项里有“Find Bugs”和“Clear Bug Markers”两项内容。
我们点中“Find Bugs”,运行结束后可以在Problems中看到增加了如下的警告信息内容。(图略)
FindBugs运行后的警告信息内容不仅在Problems视图中显示,而且将标记在源代码标记框中,在源代码编辑器中我们可以看到警告标识, 当光标指向你的警告信息的代码上面时,就会有相应的错误提示信息,与Eclipse本身的错误或警告信息提示类似。
选中Problems视图里出现的相应问题,就会在代码编辑器里切换到相应的代码上去,方便根据相应的提示信息进行代码的修改。
在Problems视图里,选中相应的问题条目,右键,在弹出的菜单中,可以看到“Show Bug Details”。
点中它,会切换到Bug Details视图上去,显示更加详细的提示信息。当然,在代码编辑窗口中,点击带有警告提示信息的图标时,也会自动切换到Bug Details窗口去,查看详细的警告信息。
选择你的项目,右键点击 Properties,选择 FindBugs可以配置Findbugs的一些选项。
3、 使用过滤器
使用过滤器我们就可以定义使用哪些bug检测器和针对哪些类进行检查,因为一旦项目比较庞大,那查看冗长的bug报告也是十分痛苦的事情。使用过滤器,过滤器用来包含或排除特殊的bug报告。这样做有助于在特定的时间段内,聚焦我们的关注点。过滤器实际是在一个xml文件定义的,xml配置文件的内容如下:
<FindBugsFilter>
<!-- 所有类使用bugcode为HE的检测器 -->
<Match>
<BugCode name ="HE"/>
</Match>
<!-- 该类使用所有的bug检测器 -->
<Match class ="com.foobar.AClass"/>
<!-- 该类使用bugcode为HE的检测器 -->
<Match class ="com.foobar.BClass">
<BugCode name ="HE"/>
</Match>
<!-- 该类的AMethod和BMethod方法使用bugcode为HE的检测器 -->
<Match class ="com.foobar.CClass">
<Or>
<Method name ="AMethod"/>
<Method name ="BMethod"/>
</Or>
<BugCode name ="HE"/>
</Match>
</FindBugsFilter>
4、Findbugs过滤器的一些元素讲解:
<FindBugsFilter>
<!-- 该类使用所有的bug检测器 -->
<Match>
<Class name="com.foobar.MyClass" />
</Match>
<!-- 该类使用bugcode为HE的检测器 -->
<Match class="com.foobar.BClass">
<BugCode name="HE" />
</Match>
<!-- 该类通过指定缩写名使用一些bug检测器 -->
<Match>
<Class name="com.foobar.MyClass" />
<Bug code="DE,UrF,SIC" />
</Match>
<!-- 所有类使用bugcode为HE的检测器 -->
<Match>
<BugCode name="HE" />
</Match>
<!-- 所有类使用bugcode为DE,UrF,SIC的检测器 -->
<Match>
<Bug code="DE,UrF,SIC" />
</Match>
<!-- 所有类通过指定检测器种类使用某些检测器 -->
<Match>
<Bug category="PERFORMANCE" />
</Match>
<!-- 该类的指定方法使用bugcode为DC的检测器 -->
<Match>
<Class name="com.foobar.MyClass" />
<Or>
<Method name="frob" params="int,java.lang.String" returns="void" />
<Method name="blat" params="" returns="boolean" />
</Or>
<Bug code="DC" />
</Match>
<!-- 该类的AMethod和BMethod方法使用bugcode为DE,UrF,SIC的检测器 -->
<Match>
<Class name="com.foobar.MyClass" />
<Or>
<Method name="AMethod" />
<Method name="BMethod" />
</Or>
<BugCode name="DE,UrF,SIC " />
</Match>
<!-- 该类的指定方法使用bug模式为OS_OPEN_STREAM的检测器 -->
<Match>
<Class name="com.foobar.MyClass" />
<Method name="writeDataToFile" />
<Bug pattern="OS_OPEN_STREAM" />
</Match>
<!-- 该类的某个方法使用优先级为2的bug模式DLS_DEAD_LOCAL_STORE 的检测器-->
<Match>
<Class name="com.foobar.MyClass" />
<Method name="someMethod" />
<Bug pattern="DLS_DEAD_LOCAL_STORE" />
<Priority value="2" />
</Match>
<!-- 代码的指定部分使用指定bugcode或bug模式的检测器 -->
<!-- 所有包的信息类使用bugcode为UUF的检测器-->
<Match>
<Class name="~.*\.Messages" />
<Bug code="UUF" />
</Match>
<!-- 所有内部包使用bugcode为MS的检测器-->
<Match>
<Package name="~.*\.internal" />
<Bug code="MS" />
</Match>
<!-- ui包层使用bug模式为SIC_INNER_SHOULD_BE_STATIC_ANON的检测器-->
<Match>
<Package name="~com\.foobar\.fooproject\.ui.*" />
<Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON" />
</Match>
<!-- 带指定标志的成员域或方法使用指定bugcode或bug模式的检测器-->
<!-- 所有类中的void main(String[])方法使用bug模式为DM_EXIT的检测器-->
<Match>
<Method returns="void" name="main" params="java.lang.String[]" />
<Bug pattern="DM_EXIT" />
</Match>
<!-- 所有类中的com.foobar.DebugInfo型的域使用bugcode为UuF的检测器-->
<Match>
<Field type="com.foobar.DebugInfo" />
<Bug code="UuF" />
</Match>
</FindBugsFilter>
相关推荐
findbugs bugs eclipse插件
Eclipse _插件 _FindBugs _使用手册.doc想不会都难啊 。
findbugs安装及使用手册,方便开发人员检查自身代码问题,
findbug的安装手册,分为插件和独立运行文件
一种基于java静态代码检查的工具,华工的同学应该要用到吧,哈哈...
findbugs使用说明:包含eclipse插件和maven插件的详细使用。
FindBugs是一个专门分析JAVA代码问题的静态代码扫描工具,在FindBugs中,选择待扫描的文件(FindBugs其实就是对编译后的class进行扫描,藉以发现一些隐藏的bug。)。如果这些.class文件有对应的源文件,这样便可以从...
eclipse中FindBugs_安装使用;eclipse FindBugs 安装使用
Findbugs代码检查工具使用说明,具体操作步骤
findbugs插件使用文档
findbugs 1.3.9 findbugs 1.3.9 findbugs 1.3.9 findbugs 1.3.9 findbugs 1.3.9 findbugs 1.3.9
最新版checkstyle,findbugs以及安装使用说明。测试无误,可以使用
自己整理的findbugs的简单使用实例
FindBugs既提供可视化 UI 界面,同时也可以作为 Eclipse插件使用。文本将主要使用将 FindBugs作为 Eclipse插件。在安装成功后会在 eclipse中增加 FindBugs perspective,用户可以对指定 Java类或 JAR文件...
myeclipse上安装FindBugs步骤和使用说明
赠送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是一个匹配编译代码模式,而非使用bug数据库的工具。当提供源代码时,FindBugs还可高亮显示检测出bug的代码行。 在它的3.0.1版本中,FindBugs继续保持着数以百计的bug描述。根据bug的严重程度,FindBugs将...
NULL 博文链接:https://tianjun309.iteye.com/blog/854389
findbugs在eclipse中安装及使用,包含如何导出简易报表