代碼分析工具findbug簡介和使用

FindBugs(http://findbugs.sourceforge.net/)版本1.1.1html

簡介:findbugs是一個在java程序中查找bug的程序,它查找bug模式的實例,也就是可能出錯的代碼實例,注意findbugs是檢查java字節碼,也就是*.class文件。java

自帶檢測器的介紹:findbugs自帶60餘種Bad practice,80餘種Correntness,1種Internationalization,
   12種Malicious code vulnerability,27種Multithreaded correntness,23種Performance,43種Dodgy。
程序員


Bad practice
壞的實踐
編程

一些很差的實踐,下面列舉幾個:數組

HE類定義了equals(),卻沒有hashCode();或類定義了equals(),卻使用Object. hashCode();或類定義了hashCode(),卻沒有equals();或類定義了hashCode(),卻使用Object.equals();類繼承了equals(),卻使用Object.hashCode()。多線程

SQLStatement的execute方法調用了很是量的字符串;或Prepared Statement是由一個很是量的字符串產生。eclipse

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
危險的

   具備潛在危險的代碼,可能運行期產生錯誤,下面列舉幾個:

   BC對抽象集合如List、Set的造型;對具體集合如ArrayList、HashSet的造型;

未檢查或沒法保證的造型;

CI類聲明爲final但聲明瞭protected的屬性。

DLS對一個本地變量賦值,但卻沒有讀取該本地變量;本地變量賦值成null,卻沒有讀取該本地變量。

ICAST整型數字相乘結果轉化爲長整型數字,應該將整型先轉化爲長整型數字再相乘。

INT不必的整型數字比較,如X <= Integer.MAX_VALUE。

NP對readline()的直接引用,而沒有判斷是否null;對方法調用的直接引用,而方法可能返回null。

REC直接捕獲Exception,而實際上可能時RuntimeException。

ST從實例方法裏直接修改類變量,即static屬性。

 

自定義檢測器:findbugs提供了強大的自定義檢測器的功能,首先咱們應該清楚須要

檢查的案例,findbugs的官方文檔裏並無詳細的介紹如何自定義,那咱們只能直接閱讀它的源碼了,着重閱讀BytecodeScanningDetector和 ByteCodePatternDetector的子類型,它們能夠檢測通常類型的問題。Findbugs利用了Byte Code Engineering Library(即BCEL,Apache上的一個開源項目),以實現其檢測器,全部的字節碼掃描都是基於visitor模式。咱們能夠參照 findbugs自帶的檢測器的類的源碼,去編寫一個自定義的檢測器代碼,編寫完後編譯成類文件,同時咱們還須要提供兩個XML文 件,Findbugs.xml和message.xml,在Findbugs.xml裏指定檢測器和實現類,檢測器的縮寫、類型如快速或慢速,而 message文件裏則包括了該檢測器的描述信息,多是html的,而後將源文件、類文件和上面兩個XML文件打包成jar文件,放在findbugs home的plugin文件夾下,這樣咱們就可使用自定義檢查器了。

 

參考文檔:

FindBugs官方文檔(http://findbugs.sourceforge.net/

FindBugs,第1部分:提升代碼質量

http://www-128.ibm.com/developerworks/cn/java/j-findbug1/

FindBugs,第2部分:編寫自定義檢測器

http://www-128.ibm.com/developerworks/cn/java/j-findbug2/

代碼靜態分析(http://blog.donews.com/foxgem/archive/2005/04/23/347444.aspx

 

Findbugs使用說明<br>目的<br> Findbugs是一個代碼質量工具;咱們用它來檢查源代碼中出現的僞問題,以期儘量在項目的初始階段將代碼問題解決。本文主要介紹Findbugs的 eclipse插件的應用。 對應的版本是:Findbugs (0.0.16);eclipse (3.1)<br><br>概要<br> FindBugs 是一個靜態分析工具,它檢查類或者 JAR 文件,將字節碼與一組缺陷模式進行對比以發現可能的問題。咱們利用它在eclipse中的插件來對它所過濾的工程的源代碼進行檢查。但願在程序員編寫代碼 的過程當中,將代碼中的缺陷指出來,讓編碼人員在開發中將它們糾正。達到儘量在項目編碼中將問題解決得目的。而不是在編碼結束的時候才用該軟件對代碼檢 查,修改。<br>

Eclipse插件開發之FindBugs插件: http://soft.yesky.com/480/2291980_1.shtml
相關文章
相關標籤/搜索