• 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

  • 相关阅读:
    vue苦逼自学之路
    第一次博客作业
    u3d学习资料
    leetcode——Divide Two Integers
    leetcode——Swap Nodes in Pairs
    leetcode——Merge k Sorted Lists
    leetcode——Container With Most Water
    leetcode——Regular Expression Matching
    leetcode——Longest Palindromic Substring
    CC_CALLBACK之间的区别
  • 原文地址:https://www.cnblogs.com/xrhou12326/p/6774386.html
Copyright © 2020-2023  润新知