Findbugs分析工具介绍

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

 常用的Findbugs分类:

我来简单介绍一下这几类bug,当然有些你是可以忽略的. 
1->Bad pratice编程的坏习惯 
主要是命名问题,比如类名最好以大写开头,字符串不要使用等号不等号进行比较,可能会有异常最好用try-catch包裹的代码,方法有返回值但被忽略等等,这些如果不想改可以直接忽略.

2->Malicious code vulnerability 恶意代码漏洞 
听起来很吓人呀,主要是一些属性直接使用public让别的类来获取,建议改为private并为其提供get/set方法. 
还有一些public的静态字段,可能会被别的包获取之类的. 
这些也需要根据项目具体情况来,个人意见,在有的不重要类,有时直接公开使用属性,可能更为便捷.如果你认为这些不需要修改,完全可以忽略.

3->Dodgy code 糟糕的代码 
·比如一个double/float被强制转换成int/long可能会导致精度损失,一些接近零的浮点数会被直接截断,事实上我们应该保留. 
这里顺便提一点,这两天看了《app研发录》,在规范代码,尽量规避错误这方面我也有了一些收获. 
在类型转换的时候,我们应该为类型转换提供一个安全的转换方法,因为我们永远不会知道,我们的app在用户手里会发生什么,所以我们要尽可能的去减少这种发生错误的可能.

·比如使用switch的时候没有提供default。

·多余的空检查,就是不可能为空的值,增加了不为空判断,这是没有必要的。属于代码冗余

·不安全的类型转换等等。 
这项太多了,就不一一列举了。

4->performance 性能 
主要是一些无用的代码,比如声明了没有用到的属性等等

5->correctness 代码的正确性 这一项应该算是最重要的了 
主要是没有对变量进行不为空判定,在特殊情况可能发生空指针异常.

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属性。

 

这篇文章还只是对FindBugs这个插件最主要的功能进行介绍,相信你能在使用过程中发现这个工具更多的用法.

该博客由博主原创,转载请声明出处 
http://blog.csdn.net/fancy_xty/article/details/51718687

转载于:https://www.cnblogs.com/xrhou12326/p/6774386.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值