finbugs簡介、安裝及使用總結(jié)

本文總結(jié)參考資料:https://baike.baidu.com/item/FindBugs/4111190
TODO項:FindBugs使用總結(jié)


FindBugs簡介

(1)finbugs:java代碼靜態(tài)分析工具,它檢查類或者 JAR 文件,將字節(jié)碼與一組缺陷模式進(jìn)行對比以發(fā)現(xiàn)可能的問題。

(2)FindBugs不注重樣式或者格式,它試圖只尋找真正的缺陷或者潛在的性能問題。

為什么使用靜態(tài)分析工具

(1)有了靜態(tài)分析工具,就可以在不實際運(yùn)行程序的情況對軟件進(jìn)行分析。

(2)檢測完畢可生成一份詳細(xì)的報告,藉由這份報告,可以發(fā)現(xiàn)許多代碼中間潛在的bug。

(3)比較典型的,如引用了空指針(null pointer dereference), 特定的資源(db connection)未關(guān)閉,等等。如果用人工檢查的方式,這些bug可能很難才會被發(fā)現(xiàn),或許永遠(yuǎn)也無法發(fā)現(xiàn),直到運(yùn)行時發(fā)作…當(dāng)除掉了這些典型的(classic) bug后,可以確信的是,我們的系統(tǒng)穩(wěn)定度將會上一個新的臺階。


FindBugs的使用

在FindBugs的GUI中,需要先選擇待掃描的.class文件(FindBugs其實就是對編譯后的class進(jìn)行掃描,藉以發(fā)現(xiàn)一些隱藏的bug。)。如果你擁有這些.class檔對應(yīng)的源文件,可把這些.java文件再選上,這樣便可以從稍后得出的報告中快捷的定位到出問題的代碼上面。此外,還可以選上工程所使用的library,這樣似乎可以幫助FindBugs做一些高階的檢查,藉以發(fā)現(xiàn)一些更深層的bug。

FindBugs常見的兩種使用時機(jī)

(1)開發(fā)階段

當(dāng)Developer完成了某一部分功能模塊開發(fā)的時候(這通常是指代碼撰寫完成,并已debug通過之后),可藉由FindBugs對該模塊涉及的java文件進(jìn)行一次掃描,以發(fā)現(xiàn)一些不易察覺的bug或是效能問題。交付新版的時候,開發(fā)團(tuán)隊可以跑一下FindBugs,除掉一些隱藏的Bug。FindBugs得出的報告可以作為該版本的一個參考文檔一并交付給測試團(tuán)隊留檔待查。

在開發(fā)階段使用FindBugs,一方面開發(fā)人員可以對新版的品質(zhì)更有信心,另一方面,測試人員藉此可以把更多的精力放在業(yè)務(wù)邏輯的確認(rèn)上面,而不是花大量精力去進(jìn)一些要在特殊狀況下才可能出現(xiàn)的BUG(典型的如Null Pointer Dereference)。從而可以提高測試的效率。

(2)維護(hù)階段

這里指的是系統(tǒng)已經(jīng)上線,卻發(fā)現(xiàn)因為代碼中的某一個bug導(dǎo)致系統(tǒng)崩潰。在除掉這個已暴露的bug之后,為了快速的找出類似的但還未暴露的 bug,可以使用FindBugs對該版的代碼進(jìn)行掃描。當(dāng)然,在維護(hù)階段使用FindBugs往往是無奈之舉,且時間緊迫。此外,如果本來在新版交付的時候就使用過FindBugs的話,往往意味著這種bug是FindBugs還無法檢測出的。這也是FindBugs局限的地方。

FindBugs出到目前的版本,功能已經(jīng)相當(dāng)強(qiáng)大,不過也有待完善的地方。從實際使用來看,有一些隱藏的bug并不能靠FindBugs直接發(fā)現(xiàn)。

那么,可不可以撰寫一個新的 Detector,來發(fā)現(xiàn)這種將一個未初始化的reference傳來傳去而形成的潛在的bug呢?理論上來講,應(yīng)該是可以的。這個 Detector目前還未實現(xiàn)。哪位如果有興趣的話,可以參考FindBugs, Part 2: Writing custom detectors(擴(kuò)展閱讀)這篇文章,幫忙實現(xiàn)這個Detector。實現(xiàn)一個新的Detector,便可以檢測出一種新型的bug,這樣不知又可以幫開發(fā)人員省去多少人工檢查的時間,功德無量啊。


FindBugs的局限性

FindBugs也不能發(fā)現(xiàn)非java的Bug。

對于非java撰寫的代碼,如javascript,SQL等等,要找出其中可能的bug,F(xiàn)indBugs是無能為力的。

當(dāng)然,javascript中的bug似乎還不至于使系統(tǒng)崩潰,而SQL中的bug往往又跟業(yè)務(wù)邏輯相關(guān),只要測試仔細(xì)一些應(yīng)該是可以發(fā)現(xiàn)的。

為什么應(yīng)該將 FindBugs 集成到編譯過程中?

經(jīng)常問到的第一個問題是為什么要將 FindBugs 加入到編譯過程中?

雖然有大量理由,最明顯的回答是要保證盡可能早地在進(jìn)行編譯時發(fā)現(xiàn)問題。

當(dāng)團(tuán)隊擴(kuò)大,并且不可避免地在項目中加入更多新開發(fā)人員時,F(xiàn)indBugs 可以作為一個安全網(wǎng),檢測出已經(jīng)識別的缺陷模式。

我想重申在一篇 FindBugs 論文中表述的一些觀點(diǎn)。如果讓一定數(shù)量的開發(fā)人員共同工作,那么在代碼中就會出現(xiàn)缺陷。像 FindBugs 這樣的工具當(dāng)然不會找出所有的缺陷,但是它們會幫助找出其中的部分。現(xiàn)在找出部分比客戶在以后找到它們要好——特別是當(dāng)將 FindBugs 結(jié)合到編譯過程中的成本是如此低時。

一旦確定了加入哪些過濾器和類,運(yùn)行 FindBugs 就沒什么成本了,而帶來的好處就是它會檢測出新缺陷。如果編寫特定于應(yīng)用程序的檢測器,則這個好處可能更大。

生成有意義的結(jié)果

重要的是要認(rèn)識到這種成本/效益分析只有在不生成大量誤檢時才有效。換句話說,如果在每次編譯時,不能簡單地確定是否引入了新的缺陷,那么這個工具的價值就會被抵消。

分析越自動化越好。如果修復(fù)缺陷意味著必須吃力地分析檢測出的大量不相干的缺陷,那么您就不會經(jīng)常使用它,或者至少不會很好地使用它。

確定不關(guān)心哪些問題并從編譯中排除它們。也可以挑出;
確實關(guān)注的一小部分檢測器并只運(yùn)行它們。另一種選擇是從個別的類中排除一組檢測器,但是其他的類不排除。FindBugs 提供了使用過濾器的極大靈活性,這可幫助生成對團(tuán)隊有意義的結(jié)果。

確定用 FindBugs 的結(jié)果做什么

可能看來很顯然,但是您想不到我參與的團(tuán)隊中有多少加入了類似 FindBugs 這樣的工具而沒有真正利用它。讓我們更深入地探討這個問題——用結(jié)果做什么?明確回答這個問題是困難的,因為這與團(tuán)隊的組織方式、如何處理代碼所有權(quán)問題等有很大關(guān)系。

不過,下面是一些指導(dǎo):

可以考慮將 FindBugs 結(jié)果加入到源代碼管理(SCM)系統(tǒng)中。一般的經(jīng)驗做法是不將編譯工件(artifact)放到 SCM 系統(tǒng)中。不過,在這種特定情況下,打破這個規(guī)則可能是正確的,因為它使您可以監(jiān)視代碼質(zhì)量隨時間的變化。

可以選擇將 XML 結(jié)果轉(zhuǎn)換為可以發(fā)送到團(tuán)隊的網(wǎng)站上的 HTML 報告。

轉(zhuǎn)換可以用 XSL 樣式表或者腳本實現(xiàn)。有關(guān)例子請查看 FindBugs 網(wǎng)站或者郵件列表。

Eclipse安裝FindBugs插件

1.點(diǎn)擊Eclipse “Help->InstallNew Software” 的Install New Software;

2.點(diǎn)擊“Add”,然后在彈出框“Name”輸入“findBugs”,“Location”輸入“http://findbugs.cs.umd.edu/eclipse”,
點(diǎn)擊“OK”

3.選擇對應(yīng)插件,然后點(diǎn)擊“next->next->finish”;

a.jpeg

4.完成安裝之后重啟eclipse,右擊項目文件或目錄,會發(fā)現(xiàn)多了Findbugs的菜單,如下圖:
b.jpeg

IDEA安裝FindBugs插件

1.在IDEA->File->Setting->Plugins搜索框中輸入findbugs進(jìn)行下載安裝;

2.重啟IDEA;

3.檢查IDEA是否成功安裝FindBugs, IDEA是否會出現(xiàn)findbugs的圖標(biāo),如下圖:

無標(biāo)題.png

FindBugs使用總結(jié)

TODO

總結(jié)

FindBugs不過是一個工具。作為開發(fā)人員,當(dāng)然首先要在編程的時候努力避免引入bug,而不要依賴于某個工具來為自己把關(guān)。不過由于代碼的復(fù)雜性,一些隱藏的bug確實很難靠咱們的肉眼發(fā)現(xiàn)。這時,應(yīng)用一些好的工具或許就可以幫你發(fā)現(xiàn)這樣的bug。這便是FingBug存在的價值。



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容