- FindBugs簡介
- 為什么使用靜態(tài)分析工具
- FindBugs的使用
- FindBugs常見的兩種使用時機(jī)
- FindBugs的局限性
- 為什么應(yīng)該將 FindBugs 集成到編譯過程中?
- 生成有意義的結(jié)果
- 確定用 FindBugs 的結(jié)果做什么
- Eclipse安裝FindBugs插件
- IDEA安裝FindBugs插件
- FindBugs使用總結(jié)
- 總結(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”;
IDEA安裝FindBugs插件
1.在IDEA->File->Setting->Plugins搜索框中輸入findbugs進(jìn)行下載安裝;
2.重啟IDEA;
3.檢查IDEA是否成功安裝FindBugs, IDEA是否會出現(xiàn)findbugs的圖標(biāo),如下圖:
FindBugs使用總結(jié)
TODO
總結(jié)
FindBugs不過是一個工具。作為開發(fā)人員,當(dāng)然首先要在編程的時候努力避免引入bug,而不要依賴于某個工具來為自己把關(guān)。不過由于代碼的復(fù)雜性,一些隱藏的bug確實很難靠咱們的肉眼發(fā)現(xiàn)。這時,應(yīng)用一些好的工具或許就可以幫你發(fā)現(xiàn)這樣的bug。這便是FingBug存在的價值。