使用 FindBugs-IDEA 插件查找代碼中潛在的 BUG

在Android自動化測試技術中,我們首先會運用各種代碼檢查工具對Android代碼進行檢查,從而提前發(fā)現代碼中存在的一些bug和隱患,提高代碼質量录语。FindBug就是Android代碼檢查最常用的工具之一。

FindBug 是一款開源的 Java 代碼檢查工具,遵循 GNU 公共許可協(xié)議。它可以檢查 Java 類或者 JAR 文件,運行的是 Java 字節(jié)碼而不是源碼,檢查原理是:將字節(jié)碼與一組缺陷模式進行對比來發(fā)現可能存在的問題,這些問題包括空指針引用购公、無限遞歸循環(huán)蕴侣、死鎖等。檢查的 bug 類型包括:

bug類型

  • Malicious code vulnerability:惡意代碼
  • Dodgy code:不符合規(guī)范的代碼
  • Internationalization:國際化相關問題滞项,如錯誤的字符串轉換;
  • Bad practice:壞的實踐:常見代碼錯誤,序列化錯誤,用于靜態(tài)代碼檢查時進行缺陷模式匹配;
  • Multithreaded correctness:多線程的正確性:如多線程編程時常見的同步,線程調度問題;
  • Performance:運行時性能問題狭归,如由變量定義,方法調用導致的代碼低效問題。
  • Correctness:可能導致錯誤的代碼,如空指針引用等;
  • Experimental:可能受到的惡意攻擊,如訪問權限修飾符的定義等;
  • Security:安全性

這里最后一個我在檢查項目的時候沒有看到文判,不知道是否真的存在过椎。

在AndroidStudio上安裝FindBugs

Android Studio 提供在線和離線兩種安裝插件的方式。

在線安裝FindBugs:

首先打開 Android Studio 的設置中的插件戏仓,輸入 FindBugs疚宇,如下圖所示亡鼠,點擊 Browse 查找,選擇 FindBugs-IDEA 然后單擊右側的 Install plugin 按鈕進行安裝(因為這里已經安裝了 FindBugs 所以右側沒有 Install plugin 按鈕)。如下圖:

在線安裝FindBugs

按步驟來(我感覺這是最詳細的敷待,歡迎來辯间涵,哈哈哈)。

離線安裝FindBugs:

首先榜揖,下載用于 IntelliJ IDEA 環(huán)環(huán)境下的 FindBugs 安裝包(下載地址:FindBugs download | SourceForge.net)勾哩。其次,打開Android Studio 的設置中的插件举哟,點擊上圖 標注3 按鈕的右邊按鈕:Install plugin from disk思劳,選擇剛才下載的 FindBugs 安裝包進行安裝即可。

FindBugs的基本使用

FindBugs 安裝完成之后需要重啟 Android Studio妨猩,重啟之后會看到 FindBugs的界面窗口潜叛,如下圖:


現在說一下,圖上標注的含義:
檢查范圍

  • 標注1:檢查當前類(只有在選中類的時候可點擊)壶硅。
  • 標注2:檢查當前包威兜。
  • 標注3:檢查當前模塊。
  • 標注4:檢查當前項目庐椒。
  • 標注5:自定義設置檢查范圍椒舵。

結果查看方式

  • 標注6:按照bug類型查看。
  • 標注7:按照類查看约谈。
  • 標注8:按照包結構查看逮栅。
  • 標注9:按照bug等級查看。

好了窗宇,還是那句話措伐,開始改吧,加油军俊!

錯誤詳情

先來看一張圖:

標注只是為了顯示點擊位置侥加,標注3只是為了顯示錯誤詳情

priority 代表了嚴重等級,紅色最嚴重粪躬,所以我們可以重點關注一下紅色担败。下方是錯誤詳情:


1. Bad practice 壞的實踐

  一些不好的實踐,下面列舉幾個: 
1)類定義了equals()镰官,卻沒有hashCode()提前;。 
2)Statement 的execute方法調用了非常量的字符串泳唠;或Prepared Statement是由一個非常量的字符串產生狈网。 
3)方法終止或不處理異常,一般情況下,異常應該被處理或報告拓哺,或被方法拋出勇垛。

2. Correctness 一般的正確性問題

  可能導致錯誤的代碼,下面列舉幾個: 
1)空指針被引用;在方法的異常路徑里,空指針被引用耘婚;方法沒有檢查參數是否null;null值產生并被引用讼积;null值產生并在方法的異常路徑被引用;傳給方法一個聲明為@NonNull的null參數脚仔;方法的返回值聲明為@NonNull實際是null币砂。 
2)類定義了hashcode()方法,但實際上并未覆蓋父類Object的hashCode()玻侥;類定義了tostring()方法,但實際上并未覆蓋父類Object的toString()亿蒸;很明顯的方法和構造器混淆凑兰;方法名容易混淆。 
3)方法嘗試訪問一個Prepared Statement的0索引边锁;方法嘗試訪問一個ResultSet的0索引姑食。 
4)所有的write都把屬性置成null,這樣所有的讀取都是null茅坛,這樣這個屬性是否有必要存在音半;或屬性從沒有被write。

3. Internationalization 國際化

  當對字符串使用upper或lowercase方法贡蓖,如果是國際的字符串曹鸠,可能會不恰當的轉換。

4. Malicious code vulnerability 惡意代碼 

  如果代碼公開斥铺,可能受到惡意攻擊的代碼彻桃,下面列舉幾個: 
1)一個類的finalize()應該是protected,而不是public的晾蜘。 
2)屬性是可變的數組邻眷;屬性是可變的Hashtable;屬性應該是package protected的剔交。

5. Multithreaded correctness 多線程的正確性

  多線程編程時肆饶,可能導致錯誤的代碼,下面列舉幾個: 
1)ESync:空的同步塊岖常,很難被正確使用驯镊。 
2)MWN:錯誤使用notify(),可能導致IllegalMonitorStateException異常;或錯誤的 
使用wait()阿宅。 
3)使用notify()而不是notifyAll()候衍,只是喚醒一個線程而不是所有等待的線程。 
4)構造器調用了Thread.start()洒放,當該類被繼承可能會導致錯誤蛉鹿。

6. Performance 性能問題

  可能導致性能不佳的代碼,下面列舉幾個: 
1)DM:方法調用了低效的Boolean的構造器往湿,而應該用Boolean.valueOf(…)妖异;用類似 
Integer.toString(1) 代替new Integer(1).toString();方法調用了低效的float的構造器领追,應該用靜態(tài)的valueOf方法他膳。 
2)SIC:如果一個內部類想在更廣泛的地方被引用,它應該聲明為static绒窑。 
3)SS: 如果一個實例屬性不被讀取棕孙,考慮聲明為static。 
4)UrF:如果一個屬性從沒有被read些膨,考慮從類中去掉蟀俊。 
5)UuF:如果一個屬性從沒有被使用,考慮從類中去掉订雾。

7. Dodgy 不符合規(guī)范的肢预,有潛在危險的

  具有潛在危險的代碼,可能運行期產生錯誤洼哎,下面列舉幾個: 
1)CI: 類聲明為final但聲明了protected的屬性烫映。 
2)DLS:對一個本地變量賦值,但卻沒有讀取該本地變量噩峦;本地變量賦值成null锭沟,卻沒有讀取該本地變量。 
3)ICAST: 整型數字相乘結果轉化為長整型數字识补,應該將整型先轉化為長整型數字再相乘冈钦。 
4)INT:沒必要的整型數字比較,如X <= Integer.MAX_VALUE李请。 
5)NP: 對readline()的直接引用瞧筛,而沒有判斷是否null;對方法調用的直接引用导盅,而方法可能返回null较幌。 
6)REC:直接捕獲Exception,而實際上可能是RuntimeException白翻。 
7)ST: 從實例方法里直接修改類變量乍炉,即static屬性绢片。

最后,參考鏈接:

輕松幫你發(fā)現Bug(FindBugs在AndroidStudio上的應用)
findbugs 性能優(yōu)化總結

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末岛琼,一起剝皮案震驚了整個濱河市底循,隨后出現的幾起案子,更是在濱河造成了極大的恐慌槐瑞,老刑警劉巖熙涤,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異困檩,居然都是意外死亡祠挫,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門悼沿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來等舔,“玉大人,你說我怎么就攤上這事糟趾』胖玻” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵义郑,是天一觀的道長蝶柿。 經常有香客問我,道長魔慷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任著恩,我火速辦了婚禮院尔,結果婚禮上,老公的妹妹穿的比我還像新娘喉誊。我一直安慰自己邀摆,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布伍茄。 她就那樣靜靜地躺著栋盹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敷矫。 梳的紋絲不亂的頭發(fā)上例获,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音曹仗,去河邊找鬼榨汤。 笑死,一個胖子當著我的面吹牛怎茫,可吹牛的內容都是我干的收壕。 我是一名探鬼主播妓灌,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜜宪!你這毒婦竟也來了虫埂?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤圃验,失蹤者是張志新(化名)和其女友劉穎掉伏,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體损谦,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡岖免,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了照捡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颅湘。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖栗精,靈堂內的尸體忽然破棺而出闯参,到底是詐尸還是另有隱情,我是刑警寧澤悲立,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布鹿寨,位于F島的核電站,受9級特大地震影響薪夕,放射性物質發(fā)生泄漏脚草。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一原献、第九天 我趴在偏房一處隱蔽的房頂上張望馏慨。 院中可真熱鬧,春花似錦姑隅、人聲如沸写隶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慕趴。三九已至,卻和暖如春鄙陡,著一層夾襖步出監(jiān)牢的瞬間冕房,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工趁矾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毒费,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓愈魏,卻偏偏與公主長得像觅玻,于是被迫代替她去往敵國和親想际。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容