Idea中使用FindBugs插件檢測Bug和潛在的問題

Idea中使用FindBugs插件檢測Bug和潛在的問題

一、安裝

依次點擊File | Settings | Plugins ,進入插件安裝。

這裏寫圖片描述

如圖所示,搜索FindBugs,進行安裝,安裝完成後,重啓idea。

這裏寫圖片描述

二、使用

在模塊或文件上右擊,鼠標移動到FindBugs,選擇分析範圍,並進行分析,也可直接打開控制檯進行操作。

這裏寫圖片描述
這裏寫圖片描述

二、問題類型說明

Bad pratice(不良行爲 )

編程上的一些壞習慣,常見如下幾種,嚴重等級不高,結合實際情況進行修改。
- HE: 類定義了equals(),卻沒有hashCode();或類定義了equals(),卻使用
- Object.hashCode();或類定義了hashCode(),卻沒有equals();或類定義了hashCode(),卻使用Object.equals();類繼承了equals(),卻使用Object.hashCode()。
- SQL:Statement 的execute方法調用了非常量的字符串;或Prepared Statement是由一個非常量的字符串產生。
- DE: 方法終止或不處理異常,一般情況下,異常應該被處理或報告,或被方法拋出。

Malicious code vulnerability(惡意代碼漏洞)

主要是一些屬性使用了public修飾符,別的類可直接獲取讓別的類來獲取,建議改爲private併爲其提供get/set方法. 或者一些public的靜態字段,可能會被別的包獲取等.此類問題需要結合實際項目情況,如果你認爲這些不需要修改,完全可以忽略。
- FI: 一個類的finalize()應該是protected,而不是public的。
- MS:屬性是可變的數組;屬性是可變的Hashtable;屬性應該是package protected的。

Dodgy code (糟糕的代碼)

具有潛在危險的代碼,可能運行期產生錯誤,此處建議修改。下面列舉幾個:
- CI: 類聲明爲final但聲明瞭protected的屬性。
- DLS:對一個本地變量賦值,但卻沒有讀取該本地變量;本地變量賦值成null,卻沒有讀取該本地變量。
- ICAST: 整型數字相乘結果轉化爲長整型數字,應該將整型先轉化爲長整型數字再相乘。
- INT:沒必要的整型數字比較,如X <= Integer.MAX_VALUE。
- NP: 對readline()的直接引用,而沒有判斷是否null;對方法調用的直接引用,而方法可能返回null。
- REC:直接捕獲Exception,而實際上可能是RuntimeException。
- ST: 從實例方法裏直接修改類變量,即static屬性。

Internationalization (國際化問題)

當對字符串使用toUpperCase或toLowerCase方法,如果是國際的字符串,可能會不恰當的轉換。

Performance (性能問題)

可能導致性能不佳的代碼,下面列舉幾個:
- DM:方法調用了低效的Boolean的構造器,而應該用Boolean.valueOf(…);用類似Integer.toString(1) 代替new Integer(1).toString();方法調用了低效的float的構造器,應該用靜態的valueOf方法。
- SIC:如果一個內部類想在更廣泛的地方被引用,它應該聲明爲static。
- SS: 如果一個實例屬性不被讀取,考慮聲明爲static。
- UrF:如果一個屬性從沒有被read,考慮從類中去掉。
- UuF:如果一個屬性從沒有被使用,考慮從類中去掉。

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。

Multithreaded currectness(線程問題)

多線程編程時,可能導致錯誤的代碼,下面列舉幾個:
- ESync:空的同步塊,很難被正確使用。
- MWN:錯誤使用notify(),可能導致IllegalMonitorStateException異常;或錯誤的使用wait()。
- No: 使用notify()而不是notifyAll(),只是喚醒一個線程而不是所有等待的線程。
- SC: 構造器調用了Thread.start(),當該類被繼承可能會導致錯誤。

此外還有Experrimental (實驗性問題)、Security (安全問題)等,具體在使用的時候都有相關信息提示,更多請參見官網。

API:http://findbugs.sourceforge.net/api/index.html
技術手冊:http://findbugs.sourceforge.net/manual/index.html
官網:http://findbugs.sourceforge.net/bugDescriptions.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章