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()。多線程
SQL:Statement的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