FindBugs 是由马里兰大学提供的一款开源 Java静态代码分析工具。FindBugs经过检查类文件或 JAR文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析。FindBugs既提供可视化 UI 界面,同时也能够做为 Eclipse插件使用。文本将主要使用将 FindBugs做为 Eclipse插件。在安装成功后会在 eclipse中增长 FindBugs perspective,用户能够对指定 Java类或 JAR文件运行 FindBugs,此时 FindBugs会遍历指定文件,进行静态代码分析。java
一:如何安装安全
安装步骤:dom
1.点击“Help->InstallNew Software”,以下图:eclipse
2.点击“Add”,而后在弹出框“Name”输入“findBugs”,“Location”输入“http://findbugs.cs.umd.edu/eclipse”,点击“OK”,以下图:工具
3.选择对应插件,而后点击“next->next->finish”。测试
4.完成安装以后重启eclipse,右击项目文件或目录,会发现多了Findbugs的菜单,以下图:ui
固然也能够直接从http://download.csdn.net/detail/hailshao/6593725下载,而后将文件复制到你本地eclipse的plugins目录,而后重启eclipse便可spa
二:如何使用.net
1, 在eclipse package Explorer 右键选择目标工程-> build project插件
2, 选择指定的包或者类进行findbug
3,添加findbugs explorer (eclipse 左下角)
4, bugs explorer 添加完毕后,咱们就能够查看刚刚找到的bugs了
技巧使用:
找出的bug有3中颜色, 黑色的臭虫标志是分类, 红色的臭虫表示严重bug发现后必须修改代码,橘黄色的臭虫表示潜在警告性bug 尽可能修改。(附录是各类bug的解释及修改方案,请你们按附表参考修改)
双击bug项目就能够在右边编辑窗口自动打开相关代码文件并链接到代码片断。 点击行号旁边的小臭虫图标后再eclipse下方输出区将提供详细的bug描述,以及修改建议等信息。咱们能够根据此信息进行修改。
附录:
代码检查常见问题及解决方法
注:如下解决方法为参考办法,若是有更好的解决办法欢迎提出,咱们共同改进。
序号 |
问题英文描述 |
问题分析 |
解决办法 |
1 |
Comparison of String objects using == or != |
比较字符串使用了双等号 |
使用String的equels()方法 |
2 |
Call to equals() comparing different types |
Equals方法比较了两个不一样的数据类型 |
转换类型后比较 |
3 |
Call to method of static java.text.DateFormat |
同一个format 屡次调用会致使线性不安全, private static final SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); 方法体内调用: format.format(new Date()); |
在方法体内使用,尽可能避免定义全局的对象 format.format(new Date()); |
4 |
Bad attempt to compute absolute value of signed 32-bit random integer |
String nums = Math.abs(r.nextInt()) + ""; |
修改成String nums = Math.abs(r.nextInt(Integer.MAX_VALUE)) + ""; |
5 |
The class name com.aisino.fpcxbd.action.printAction doesn't start with an upper case letter |
类名首字母大写 |
类名首字母大写 |
6 |
Dead store to rePacket |
不被使用的变量或常量 |
看业务是否会使用,若是不使用,请删除,若是有使用,初始值不要直接new 一个对象,初始值能够置为null |
7 |
Exception is caught when Exception is not thrown |
没有抛出异常时,异常被捕获
|
结合业务进行处理 |
8 |
Load of known null value |
填充了空值 |
若是没有的空值,请删除 |
9 |
Method invokes inefficient new String(String) constructor |
方法中调用了低效的new String()构造方法,如 context.put("name",new String("Velocity") ); |
若是内容自己为字符串,则直接赋值便可,如 context.put("name","Velocity" ); |
10 |
Method may fail to close stream |
方法可能未关闭stream,方法产生了一个IO流,却未关闭,将会致使文件描绘符的泄漏。 |
建议使用finally block来确保io stream被关闭。若是无异常,请使用完毕后关闭IO流。 |
11 |
Method might ignore exception |
捕捉了异常,可是没有进行处理 |
须要在catch体中对异常进行处理。或者打印相关的描述。 |
12 |
Method names should start with a lower case letter |
方法首字母没有小写, 没有遵循Java命名规范 |
请将方法首字母小写 |
13 |
Method uses the same code for two branches |
例如: fpkjmx.setSyl(fpkjmx.getSyl()); |
请确认该写法是否有意义。 |
14 |
Non-transient non-serializable instance field in serializable class |
在可序列化的类中存在不能序列化或者不能暂存的数据
|
将属性对象实现可实例化 |
15 |
Null pointer dereference |
会出现空指针,如 if(null != nsrxx){ }else{ nsrxx.setLoginZt(3); } |
这种逻辑有明显的错误,请根据业务修改 |
16 |
Nullcheck of value previously dereferenced |
会出现空指针异常 |
先作非空判断,再进行业务逻辑的处理,避免空指针异常 |
17 |
Possible null pointer dereference |
可能会出现空指针异常 |
请根据业务处理,若有必要先作非空判断 |
18 |
Possible null pointer dereference in method on exception path |
在异常部分放弃null值检查,可能会致使后面的代码出现空指针异常 |
请根据业务进行处理 |
19 |
Redundant nullcheck of value known to be non-null |
该对象已不为空,没有必要再作非空判断 |
没有必要的判断去掉便可,(根据实际业务) |
20 |
Redundant nullcheck of value known to be non-null |
已知该对象为空,没有必要再作非空判断 |
已知该对象为空,没有必要再作非空判断 |
21 |
Repeated conditional tests |
重复条件测试 |
重复的判断,请去掉一个 |
22 |
Self assignment of local variable |
自赋值的局部变量 |
请检查代码,是否能够去掉自赋值 |
23 |
Should be a static inner class |
应该定义为静态内部类 |
若是出现该提示,请定义为静态内部类 |
24 |
Store of non serializable object into HttpSession |
在HttpSession中存放非序列化的对象
|
将Javabean实现可实例化 |
25 |
Unread field |
未被使用的变量或对象 |
请查看代码,若是没有引用,请删除或者注释掉 |