還不會用FindBugs?你的程式碼品質很可能令人堪憂
- 2019 年 11 月 8 日
- 筆記
前言
項目中程式碼品質,往往需要比較有經驗的程式設計師的審查來保證。但是隨著項目越來越大,程式碼審查會變得越來越複雜,需要耗費越來越多的人力。而且程式設計師的經驗和精力都是有限的,能審查出問題必定有限。而在對程式碼品質要求越來越嚴格的當今IT界,這無疑是個矛盾點。幸運的是,不少公司發布了程式碼掃描工具,來檢測程式碼中存在的問題。儘管它們無法掃描出所有的bug,但仍然能夠為我們的工作帶來極大的便利。其中FindBugs就是這其中的佼佼者,本文將結合Android Studio來介紹該工具的使用。
一、FindBugs簡介
FindBugs是一款Java缺陷檢測工具,它通過分析靜態位元組碼可以查找出200多種錯誤模式,例如空指針取消引用、無限遞歸循環、Java庫的錯誤使用和死鎖等。
二、安裝FindBugs插件
Android Studio默認是沒有安裝FindBugs插件的,需要我們自己進行安裝。所幸Android Studio提供了豐富的插件,可以直接從庫插件庫中進行安裝。當然也可以自己手動從網上下載好該插件,然後安裝。這裡將兩種方法都簡單介紹一下。
1、從Android Studio插件庫中安裝
點擊面板中主菜單Files > Settings > Plugs 就可以 進入到插件中心,如下圖所示:
②處可以輸入要查找的插件名,如果安裝了,並滿足③處篩選條件,會顯示在④處列表中。
③處選擇篩選範圍,
④處用於顯示在②處和③處所指定條件下查詢到的插件列表,右邊的選擇框可選中表示該插件可以用,否則表示不可用。
⑤處顯示選擇的插件的相關資訊
⑥處是一個入口,可以跳轉去安裝JetBrains提供的插件。
⑦處用於跳轉到從倉庫中瀏覽並安裝插件。
⑧處用於安轉下載到本地的插件。
這裡我們選擇從“Browse Repositories”進入安裝,進入後搜索“FindBugs”會顯示如下介面,我們選擇“FindBugs-IDEA”進行安裝。(我這裡是已經安裝過了,如果沒有安裝,右邊會顯示“install”按鈕。)
安裝完成後,返回到Plugs主面板,搜索“FindBugs”就會顯示如下介面,如果不想用了,可以點擊“Uninstall”來卸載。
當安裝完成後,會提示重啟AS,重啟動後即可使用了。
2、從磁碟安裝
首先手動下載該插件,這裡提供下一個鏈接:https://pan.baidu.com/s/1qbtsnCby-xpmbC9jBdfMSg ,提取碼:fuae。
仍然是從上述的插件面板中操作,選擇第⑧點擊“Install plugin from disk”後選擇下載好的插件,按照提示操作即可。
三、FindBugs的啟動
安裝成功後,有兩種方式可以啟動FindBugs的分析功能。
1、從控制面板中啟動
在AS介面的左下角有個“FindBugs-IDEA”按鈕,如下圖紅框所示,通過點擊該按鈕,可以調起工具窗口面板,通過該窗口可以開始啟動分析(工具窗口面板及其使用,後面會介紹)。
2、通過右鍵菜單啟動
在AS介面點擊右鍵,在彈出的菜單欄中可以看到“FindBugs”選項,子菜單欄中可以選擇要分析的文件範圍(AS的不同區域點擊右鍵,“FindBugs”選項的位置和子菜單也會略有不同)。
四、FindBugs的基本使用
分析完成後,默認會顯示如下介面。這裡對該面板各個區域進行介紹。
1、工具窗口
該區域提供了眾多的選項,可以方便設置分析範圍和展示分析結果。
這裡對其中幾項再詳細進行說明。
(1)bug的類型
按照第12點根據bug類型分組後,會顯示如下介面:
當前模組分析結果只展示了部分類型的bug,實際上FindBugs可以展示9中類型:
1)Bad practice
不好的實踐。比如不規範的類、方法、變數的命名;調用有返回值的方法時沒有正確使用返回值等。
2)Dodgy code
可疑的程式碼。比如使用switch/case語法,沒有使用default;數據計算後的精度丟失等。
3)Malicious code vulnerability
惡意的程式碼漏洞,如果程式碼公開,可能導致惡意的修改和攻擊。比如該使用final修改的常量沒有使用final,導致該常量可能被修改;該使用protected修飾的,卻使用public修飾,這不利於對成員的保護;
4)Correctness
正確性問題,不正確使用會導致報錯。比如該判斷空指針的地方沒有判空,這會導致空指針異常;構造函數中使用了沒有複製的變數,如果使用時對該變數有判空,該語句不會執行,而如果沒有判空,則會報空指針異常。
5)Performance
性能問題。比如定義了某些變數卻從未被讀取過;定義的變數從未被使用過等,在執行過程中會佔用空間和時間,建議刪掉;內部類應該加上static修飾符;可以採用更高效的函數來實現功能等。
6)Multithreaded correctness
多執行緒正確性,主要是多執行緒環境下執行緒安全問題。比如volatile的不正確使用;該使用syncronized關鍵字的地方沒有使用等。
7)Experimental
實驗。
8)Security
安全性問題。要掃描到安全方面的bug,需要在設置>FindBugs-IDEA >General > Plugins中添加Find Security Bugs插件。這裡主要聚焦於安全方面的問題,比如向sdcard等存儲卡中寫數據,其中可能包含私人資訊;寫入sdcard等存儲器數據容易被其它程式讀取;使用的加密演算法不夠安全等。
9)Internationalization(I18N)
國際化問題。比如字元串與位元組相互轉換時的字符集問題等,有些地方需要顯示指定字符集,因為不同平台或語言使用的字符集有差異。
這裡僅對這幾個大類簡單的介紹,由於能檢測到的錯誤項非常多,無法一一舉例。在實際使用過程中,可以查看具體項,根據提示來解決問題。當然,有些問題,FindBugs報出來了,但我們實際工作中可能想忽略掉,不希望被檢測,可以在設置中選擇要分析的項,後面會介紹該設置項。
(2)Bug的嚴重級別
第15點中,按照bug嚴重級別進行排列,分析結果會以如下形式展示,每一項點擊後可以查看更詳細的列表:
其嚴重級別分為分為如下4個等級:
1)Of Concren 建議, 如果遵循能更好的完善程式碼
2)Troubling 不好的, 可能會引發不良後果
3)Scary 嚴重問題, 在某種情況下一定會出現問題
4)Scariest 非常嚴重, 已經影響到當前程式功能
(3)設置
進入到FindBugs的高階設置面板。
2、分析結果顯示區
以樹狀結構展示分析後的結果,可以通過工具窗口中的選擇,來決定該區域是展開還是關閉,以什麼對結果進行分組,需要顯示哪些內容等。
3、bug預覽區
當選擇具體某一個bug時,此處會顯示問題點所在的上下文環境。
4、bug詳情區
這部分展示了選中的bug的詳細資訊,比如所在的類,方法,有問題的欄位,當期bug是什麼樣的問題,為什麼需要修改,修改建議等。
五、FindBugs的高階使用
控制面板中提供了“設置”入口,從這個入口可以配置FindBlugs的一些更高階的用法。比如添加安全相關問題的掃描,過濾哪些文件不掃描,設置報告文檔中不包含那些問題項等。這一節介紹其中比較常用的一些功能點。該設置面板的路徑為:設置 > FindBugs-IDEA。
1、General
這一欄總共有六項
(1)Compile affected files before analyze 在分析之前進行編譯
(2)Analyze affected files affter comlplie 在變動的文件編譯之後分析
(3)Analyze affected files after auto make 在自動Make之後分析變動的文件 自動
(4)Run analyze in background 在後台分析,不顯示進度條窗口
(5) Active toolwindow on run
(6)Plugins
這部分可以再添加一些加強FindBugs功能的插件,前面提到過的“Security”,就需要用到這裡的“find Security Bugs”插件來掃描。
2、Report
這一項中有多個選項,用於選擇報告文件中要包含的內容。
3、Filter
過濾器,用於過濾哪些文件需要掃描,哪些不用掃描。
4、Detector
用於配置檢測器列表,選中的檢測器將參與到掃描中。
5、Annotate
註解相關的設置,這一部分均選擇默認即可。
6、Share
共享設置文件,一般可以忽略。
結語
本文只介紹了FindBugs常見的一些使用方法,一定還有很多很牛的功能,希望讀者們多多探索,多多交流,共同進步,謝謝!