现在的位置: 首页 > 综合 > 正文

eclipse FindBugs 安装使用

2017年11月28日 ⁄ 综合 ⁄ 共 2668字 ⁄ 字号 评论关闭

       FindBugs是个专门用来发现Java代码中的Bug的Eclipse小插件,与Eclipse无缝结合,可以实现敲入代码、保存文件、编译时即时反馈给用户Bug信息,比Eclipse自带的JavaBug管理功能要强。FindBugs一共有三个版本,除过Eclipse插件板本外,还提供一个独立版本的Java程序(基于SWing)和一个Ant
Task版本;下面介绍Eclipse的插件版。

 

一、 安装

打开MyEclipse 的help -> SoftWave Updates -> Find and Install

如图:

 

 

点击next

在下图中,点击New Remote site,在弹出的窗口中输入 Name:findBugs,

URL:http://findbugs.cs.umd.edu/eclipse

 

点击ok

然后按下图操作。


点击完成


最后按提示安装。

 

二、配置

在工程栏选中一个项目,按Alt + Enter 键

 

如上操作即可。

 

 

 

 

 

 

三、使用

1、 对项目使用findBugs

选中项目,如下图操作:

 

点击Find Bugs后,findBugs会查找整个项目的bug。

之后,如图操作:


在弹出的窗口,如图操作:


最后,窗口会按bug的高低级别显示程序bug:


2、 在编写代码时使用findBugs

编写代码时,findBugs会查找bug,并给有bug行一个爬虫logo标示,如下图:

 

点击爬虫图标会显示具体的bug,如下图:

 

 

Findbugs缺陷描述:

Findbugs是一个静态分析工具,它检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。Findbugs自带检测器,其中有60余种Bad
practice
80余种Correctness1Internationalization12Maliciouscode
vulnerability
27Multithreadedcorrectness23Performance43Dodgy

Bad practice坏的实践

一些不好的实践,下面列举几个:

HE类定义了equals(),却没有hashCode();或类定义了equals(),却使用

Object.hashCode();或类定义了hashCode(),却没有equals();或类定义了hashCode(),却使用Object.equals();类继承了equals(),却使用Object.hashCode()

SQLStatementexecute方法调用了非常量的字符串;或Prepared
Statement
是由一个非常量的字符串产生。

DE方法终止或不处理异常,一般情况下,异常应该被处理或报告,或被方法抛出。

Correctness一般的正确性问题

可能导致错误的代码,下面列举几个:

NP空指针被引用;在方法的异常路径里,空指针被引用;方法没有检查参数是否nullnull值产生并被引用;null值产生并在方法的异常路径被引用;传给方法一个声明为@NonNullnull参数;方法的返回值声明为@NonNull实际是null

Nm类定义了hashcode()方法,但实际上并未覆盖父类ObjecthashCode();类定义了tostring()方法,但实际上并未覆盖父类ObjecttoString();很明显的方法和构造器混淆;方法名容易混淆。

SQL方法尝试访问一个PreparedStatement0索引;方法尝试访问一个ResultSet0索引。

UwF所有的write都把属性置成null,这样所有的读取都是null,这样这个属性是否有必要存在;或属性从没有被write

Internationalization国际化

当对字符串使用upperlowercase方法,如果是国际的字符串,可能会不恰当的转换。

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

NPreadline()的直接引用,而没有判断是否null;对方法调用的直接引用,而方法可能返回null

REC直接捕获Exception,而实际上可能是RuntimeException

ST从实例方法里直接修改类变量,即static属性。

 

更多的描述请见:http://findbugs.sourceforge.net/bugDescriptions.html

缺陷模式汇总:http://www.strutshome.com/index.php/archives/379

抱歉!评论已关闭.