天天看點

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的bug

對代碼品質要求越來越高的如今IT界,代碼品質往往需要有經驗的程式員通過代碼審查來保證。然後程式員精力和經驗畢竟有限,随着項目越來越大,僅靠人工來把控,終究難以應對。這種情況下,代碼品質檢測工具就受到了各個公司的青睐,FindBugs便是其中的佼佼者。本文将基于Android Studio來詳細介紹FindBugs的使用。

前言

       轉載請聲明,轉自【https://www.cnblogs.com/andy-songwei/p/11820564.html】,謝謝!

       項目中代碼品質,往往需要比較有經驗的程式員的審查來保證。但是随着項目越來越大,代碼審查會變得越來越複雜,需要耗費越來越多的人力。而且程式員的經驗和精力都是有限的,能審查出問題必定有限。而在對代碼品質要求越來越嚴格的當今IT界,這無疑是個沖突點。幸運的是,不少公司釋出了代碼掃描工具,來檢測代碼中存在的問題。盡管它們無法掃描出所有的bug,但仍然能夠為我們的工作帶來極大的便利。其中FindBugs就是這其中的佼佼者,本文将結合Android Studio來介紹該工具的使用。

一、FindBugs簡介

      FindBugs是一款Java缺陷檢測工具,它通過分析靜态位元組碼可以查找出200多種錯誤模式,例如空指針取消引用、無限遞歸循環、Java庫的錯誤使用和死鎖等。

二、安裝FindBugs插件

       Android Studio預設是沒有安裝FindBugs插件的,需要我們自己進行安裝。所幸Android Studio提供了豐富的插件,可以直接從庫插件庫中進行安裝。當然也可以自己手動從網上下載下傳好該插件,然後安裝。這裡将兩種方法都簡單介紹一下。

  1、從Android Studio插件庫中安裝 

       點選面闆中主菜單Files > Settings  > Plugs 就可以 進入到插件中心,如下圖所示:

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的bug

       ②處可以輸入要查找的插件名,如果安裝了,并滿足③處篩選條件,會顯示在④處清單中。

       ③處選擇篩選範圍,

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的bug

       ④處用于顯示在②處和③處所指定條件下查詢到的插件清單,右邊的選擇框可選中表示該插件可以用,否則表示不可用。  

       ⑤處顯示選擇的插件的相關資訊

       ⑥處是一個入口,可以跳轉去安裝JetBrains提供的插件。

       ⑦處用于跳轉到從倉庫中浏覽并安裝插件。

       ⑧處用于安轉下載下傳到本地的插件。

       這裡我們選擇從“Browse Repositories”進入安裝,進入後搜尋“FindBugs”會顯示如下界面,我們選擇“FindBugs-IDEA”進行安裝。(我這裡是已經安裝過了,如果沒有安裝,右邊會顯示“install”按鈕。)

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的bug

安裝完成後,傳回到Plugs主面闆,搜尋“FindBugs”就會顯示如下界面,如果不想用了,可以點選“Uninstall”來解除安裝。

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的bug

當安裝完成後,會提示重新開機AS,重新開機動後即可使用了。

2、從磁盤安裝

    首先手動下載下傳該插件,這裡提供下一個連結:https://pan.baidu.com/s/1qbtsnCby-xpmbC9jBdfMSg ,提取碼:fuae。

    仍然是從上述的插件面闆中操作,選擇第⑧點選“Install plugin from disk”後選擇下載下傳好的插件,按照提示操作即可。

三、FindBugs的啟動

       安裝成功後,有兩種方式可以啟動FindBugs的分析功能。

  1、從控制台中啟動

       在AS界面的左下角有個“FindBugs-IDEA”按鈕,如下圖紅框所示,通過點選該按鈕,可以調起工具視窗面闆,通過該視窗可以開始啟動分析(工具視窗面闆及其使用,後面會介紹)。

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的bug

  2、通過右鍵菜單啟動

       在AS界面點選右鍵,在彈出的菜單欄中可以看到“FindBugs”選項,子菜單欄中可以選擇要分析的檔案範圍(AS的不同區域點選右鍵,“FindBugs”選項的位置和子菜單也會略有不同)。

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的bug

四、FindBugs的基本使用

       分析完成後,預設會顯示如下界面。這裡對該面闆各個區域進行介紹。

  1、工具視窗

       該區域提供了衆多的選項,可以友善設定分析範圍和展示分析結果。

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的bug

這裡對其中幾項再詳細進行說明。

    (1)bug的類型

       按照第12點根據bug類型分組後,會顯示如下界面:

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的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嚴重級别進行排列,分析結果會以如下形式展示,每一項點選後可以檢視更詳細的清單:

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的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

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的bug

這一欄總共有六項

    (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

       這一項中有多個選項,用于選擇報告檔案中要包含的内容。

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的bug

   3、Filter

       過濾器,用于過濾哪些檔案需要掃描,哪些不用掃描。

  4、Detector

       用于配置檢測器清單,選中的檢測器将參與到掃描中。

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的bug

  5、Annotate

       注解相關的設定,這一部分均選擇預設即可。

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的bug

  6、Share

       共享設定檔案,一般可以忽略。

【工利其器】必會工具之(五)FindBugs篇——讓工具找出你代碼中的bug

結語

       本文隻介紹了FindBugs常見的一些使用方法,一定還有很多很牛的功能,希望讀者們多多探索,多多交流,共同進步,謝謝!

繼續閱讀