一。安裝html
FindBugs 是由馬里蘭大學提供的一款開源 Java靜態代碼分析工具。FindBugs經過檢查類文件或 JAR文件,將字節碼與一組缺陷模式進行對比從而發現代碼缺陷,完成靜態代碼分析。FindBugs既提供可視化 UI 界面,同時也能夠做爲 Eclipse插件使用。文本將主要使用將 FindBugs做爲 Eclipse插件。在安裝成功後會在 eclipse中增長 FindBugs perspective,用戶能夠對指定 Java類或 JAR文件運行 FindBugs,此時 FindBugs會遍歷指定文件,進行靜態代碼分析。java
安裝步驟:程序員
1.點擊「Help->InstallNew Software」,以下圖:編程
2.點擊「Add」,而後在彈出框「Name」輸入「findBugs」,「Location」輸入「http://findbugs.cs.umd.edu/eclipse」,點擊「OK」,以下圖:數組
3.選擇對應插件,而後點擊「next->next->finish」。多線程
4.完成安裝以後重啓eclipse,右擊項目文件或目錄,會發現多了Findbugs的菜單,以下圖:eclipse
固然也能夠直接從http://download.csdn.net/detail/hailshao/6593725下載,而後將文件複製到你本地eclipse的plugins目錄,而後重啓eclipse便可。編輯器
使用小結:工具
今天代碼質量再次強調java代碼提交SVN前要通過findBugs檢查,雖然根據菜單我也基本會有findBugs插件,但爲了更全面的學習、更高效的利用,我搜索學習了findbugs的用法。性能
Findbugs是一個靜態分析工具,它檢查類或者JAR 文件,將字節碼與一組缺陷模式進行對比以發現可能的問題。Findbugs自帶檢測器,其中有60餘種Bad practice,80餘種Correctness,1種 Internationalization,12種Malicious code vulnerability,27種Multithreaded correctness,23種Performance,43種Dodgy。咱們還能夠本身配置檢查規則(作哪些檢查,不作哪些檢查),也能夠本身來實現 獨有的校驗規則(用戶自定義特定的bug模式須要繼承它的接口,編寫本身的校驗類,屬於高級技巧)。
白 盒測試中的靜態檢查通常是檢查編碼標準規範,錯誤列表。編碼規範每每團隊會根據本身的經驗和風格進行設置一些規範。如今不少IDE工具都會在編輯代碼的時 候實時的提醒是否符合代碼風格。錯誤列表,通常是代碼潛在的bug,因爲某種代碼寫法雖然沒有語法錯誤,可是可能存在錯誤,好比會致使線程死鎖。這些都是 錯誤列表應該檢查的。靜態檢查的可操做方式:
一、代碼走查:
程序員之間能夠隔必定的時間抽取代碼進行走查。
走查的時候根據彙總報告,把這些經驗匯成列表,做爲下次代碼走查的依據。
該方式的特色是,手工、多人討論、操做簡單,可是效率會比較低。
二、代碼掃描
使用軟件對咱們的代碼進行掃描,查找出潛在的問題。如今有許多商業的工具可以進行掃 描,好比Parasoft JTest、Software Analyzer、pclint等工具,每每不一樣的工具會針對不一樣的語言。固然也有不少開源的工具。在這裏java方面主要推薦Findbugs。 Findbugs能夠在ANT/GUI/ECLIPSE三個環境中運行,同時也能夠編寫本身的檢測器,功能比較完善。咱們平時能夠收集本身的或者是別人的 開發經驗,把它作成檢測器來完善Findbugs的檢測體系。軟件掃描的特色是,機器掃描、效率高,可是沒不夠靈活,擴展比較負責。
參考:http://blog.csdn.net/ml5271169588/article/details/6975701
http://www.cnblogs.com/hyddd/archive/2008/12/16/1356310.html
工具 |
目的 |
檢查項 |
FindBugs 檢查.class |
基於Bug Patterns概念,查找javabytecode(.class文件)中的潛在bug |
主要檢查bytecode中的bug patterns,如NullPoint空指針檢查、沒有合理關閉資源、字符串相同判斷錯(==,而不是equals)等 |
PMD 檢查源文件 |
檢查Java源文件中的潛在問題 |
主要包括: 空try/catch/finally/switch語句塊 未使用的局部變量、參數和private方法 空if/while語句 過於複雜的表達式,如沒必要要的if語句等 複雜類 |
CheckStyle 檢查源文件 主要關注格式 |
檢查Java源文件是否與代碼規範相符 |
主要包括: Javadoc註釋 命名規範 多餘沒用的Imports Size度量,如過長的方法 缺乏必要的空格Whitespace 重複代碼 |
摘自:http://developer.51cto.com/art/200906/127165.htm
本文主要介紹在Eclipse中使用的狀況
FindBugs是一個能夠在Java程序中發現Bugs的程序。它是專門用來尋找處於"Bug Patterns"列表中的代碼的。Bug Patterns指頗有多是錯誤的代碼的實例。
打開Bug Details視圖Windows => Show View => Other… => FindBugs => BugDetails
在Package Explorer或Navigator視圖中,選中你的Java項目,右鍵,能夠看到"Find Bugs"菜單項,子菜單項裏有"Find Bugs"和"Clear Bug Markers"兩項內容,以下圖所示:
咱們創建一個簡單的測試文件Test.java 內容以下:
public class Test { private String[] name; public String[] getName() { return name; } public void setName(String[] name) { this.name = name; } } |
咱們點中"Find Bugs",運行時會出現以下進度框:
運行結束後能夠在Problems中看到增長了以下的警告信息內容
FindBugs運行後的警告信息內容不只在Problems視圖中顯示,並且將標記在源代碼標記框中,在源代碼編輯器中咱們能夠看到警告標識,以下圖:
當光標指向你的警告信息的代碼上面時,就會有相應的錯誤提示信息,與Eclipse自己的錯誤或警告信息提示相似。
選中Problems視圖裏出現的相應問題,就會在代碼編輯器裏切換到相應的代碼上去,方便根據相應的提示信息進行代碼的修改。
在Problems視圖裏,選中相應的問題條目,右鍵,在彈出的菜單中,能夠看到"Show Bug Details",以下圖所示:
點中它,會切換到Bug Details視圖上去,顯示更加詳細的提示信息。
固然,在代碼編輯窗口中,點擊帶有警告提示信息的圖標時,也會自動切換到Bud Details窗口去,查看詳細的警告信息,以下圖所示。
根據這裏詳細的信息,你能夠獲得FindBugs爲何會對你的代碼報警告信息,及相應的處理辦法,根據它的提示,你能夠快速方便地進行代碼修改。
根據提示,咱們將代碼修改爲以下,再運行就不會報有警告信息了。
public class Test { private String[] name; public String[] getName() { String[] temp = name; return temp; } public void setName(String[] name) { String[] temp = name; this.name = temp; } } |
配置FindBugs
選擇你的項目,右鍵 => Properties => FindBugs =>
能夠配置的信息包括如上圖所示的四個選項的相關設置:
1. Run FindBugs Automatically開關
當此項選中後,FindBugs將會在你修改Java類時自動運行,如你設置了Eclipse自動編譯開關後,當你修改完Java文件保存,FindBugs就會運行,並將相應的信息顯示出來。
當此項沒有選中,你只能每次在須要的時候本身去運行FindBugs來檢查你的代碼。
2. Minimum priority to report選擇項
這個選擇項是讓你選擇哪一個級別的信息進行顯示,有Low、Medium、High三個選擇項能夠選擇,很相似於Log4J的級別設置啦。 好比:
你選擇了High選擇項,那麼只有是High級別的提示信息纔會被顯示。
你選擇了Medium選擇項,那麼只有是Medium和High級別的提示信息纔會被顯示。
你選擇了Low選擇項,那麼全部級別的提示信息都會被顯示。
3. Enable bug categories選擇項
在這裏是一些顯示Bug分類的選擇:
Correctness關於代碼正確性相關方面的
Performance關於代碼性能相關方面的
Internationalization關於代碼國際化相關方面的
Multithreaded correctness關於代碼多線程正確性相關方面的
Style關於代碼樣式相關方面的
Malicious code vulnerability關於惡意破壞代碼相關方面的
好比:若是你把Style的檢查框去掉不選擇中它,那麼與Style分類相關的警告信息就不會顯示了。其它的相似。
4. Select bug patterns to check for選擇項
在這裏你能夠選擇所要進行檢查的相關的Bug Pattern條目
能夠從Bug codes、Detector name、Detector description中看到相應的是要檢查哪些方面的內容,你能夠根據須要選擇或去掉相應的 檢查條件。
3、詳細說明
Findbugs是一個 靜態分析工具,它檢查類或者JAR 文件,將字節碼與一組缺陷模式進行對比以發現可能的問題。Findbugs自帶檢測器,其中有60餘種Bad practice,80餘種Correctness,1種 Internationalization,12種Malicious code vulnerability,27種Multithreaded correctness,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是由一個很是量的字符串產生。
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屬性。
可參考:http://blog.csdn.net/fanyuna/article/details/6860198