FindBugs,一個不錯的靜態(tài)分析工具

最近在做軟件質(zhì)量保證與測試的助教,第一個實驗就需要講解FindBugs,因此,將整個過程梳理了一下,望各位大神分享你們的觀點,共同進步。

一,基本原理

1. Findbugs是一個靜態(tài)分析工具,它檢查類或者JAR 文件,將字節(jié)碼與一組缺陷模式進行對比以發(fā)現(xiàn)可能的問題。現(xiàn)在有許多工具可以進行靜態(tài)代碼分析,比如:Parasoft JTest、Software Analyzer、pclint等,不同的工具一般針對不同的語言,而FindBugs針對的就是Java語言。Findbugs可以在ANT/GUI/ECLIPSE三個環(huán)境中運行,同時也可以編寫自己的檢測器,功能比較完善。

它主要用到的技術是缺陷模式匹配數(shù)據(jù)流分析

1)缺陷模式匹配:事先從代碼分析經(jīng)驗中收集足夠多的共性缺陷模式,將待分析代碼與已有的共性缺陷模式進行模式匹配,從而完成軟件的安全分析。這種方式的優(yōu)點是簡單方便,但是要求內(nèi)置足夠多缺陷模式,且容易產(chǎn)生誤報。

2)數(shù)據(jù)流分析:數(shù)據(jù)流分析也是一種軟件驗證技術,這種技術通過收集代碼中引用到的變量信息,從而分析變量在程序中的賦值、引用以及傳遞等情況。對數(shù)據(jù)流進行 分析可以確定變量的定義以及在代碼中被引用的情況,同時還能夠檢查代碼數(shù)據(jù)流異常,如引用在前賦值在后、只賦值無引用等。數(shù)據(jù)流分析主要適合檢驗程序中的 數(shù)據(jù)域特性。

2. FindBugs檢查.class文件,基于Bug Patterns概念,查找javabytecode(.class文件)中的潛在bug。主要檢查bytecode中的bug patterns,如NullPoint空指針檢查、沒有合理關閉資源、字符串相同判斷錯(==,而不是equals)等。

3. Findbugs自帶檢測器,其中有60余種Bad practice,80余種Correctness,1種 Internationalization,12種Malicious code vulnerability,27種Multithreaded correctness,23種Performance,43種Dodgy。

4. FindBugs有兩種使用形式,一是作為插件,放在Eclipse中使用,二是提供軟件運行。而作為插件的形式比較方便簡單,個人覺得使用起來比較合適。

5.FindBugs內(nèi)置的編程規(guī)范包括:

1)Bad practice 壞的實踐:常見代碼錯誤,用于靜態(tài)代碼檢查時進行缺陷模式匹配

2)Correctness 可能導致錯誤的代碼,如空指針引用等

3)國際化相關問題:如錯誤的字符串轉(zhuǎn)換

4)可能受到的惡意攻擊,如訪問權限修飾符的定義等

5)多線程的正確性:如多線程編程時常見的同步,線程調(diào)度問題。

6)運行時性能問題:如由變量定義,方法調(diào)用導致的代碼低效問題。

二,bug類型

1.當數(shù)據(jù)類型不對,進行equals比較時會檢查出bug;

2.當使用String類型字符串進行循環(huán)相加時,不會提示使用StringBuffer。

3.當檢查條件重復時會提示bug,比如:


4. 類靜態(tài)變量未初始化,調(diào)用會檢查到bug:

5. 會檢查到字符串方法調(diào)用bug:

6.不會檢查到多余的toString():

7.會檢查到多次重復調(diào)用隨機函數(shù)bug:

8.數(shù)組越界發(fā)現(xiàn)不了:

我猜想是因為這個編譯都不能通過的原因。

以上這些簡單的Test case只是我講解實驗時提出的一部分,F(xiàn)indBugs還能發(fā)現(xiàn)更多的bug,在此不做過多的介紹。

參考鏈接

三,深入理解Findbugs

1. Findbugs不是通過分析類文件的形式或結構來確定程序的意圖,而是通常使用 觀察者模式,檢查類或者 JAR 文件,將字節(jié)碼與一組缺陷模式進行對比以發(fā)現(xiàn)可能的問題。PMD也是一款靜態(tài)代碼分析工具,它是分析Java源文件。

2.可以下載到源代碼,對源代碼進行分析。源代碼目錄如下(版本號3.0.1)

1)src/jui包是Findbugs開發(fā)UI界面使用到的包,src/junit是單元測試包,里面包含有對很多類的測試用例。etc文件下是包含的一些配置文件。

2)src/tools包下面有四個子文件夾,里面包含的是一些公用的工具類,比如打印bug描述,生成xml文件等。

3)src/antTask包下面是針對Ant的一些類。

4)最主要的就是src/java包下面的將近50個子文件夾,如下(未截完):

該工具自帶了一些檢測器,于此同時,開發(fā)者可以根據(jù)自己的需求設計編寫特定于應用程序的缺陷檢測器。

5)有一個專門的文件夾edu.umd.cs.findbugs.detect,里面包含該工具提供的所有檢測器,F(xiàn)indBugs 利用了 Byte Code Engineering Library,或稱為 BCEL,以實現(xiàn)其檢測器。所有字節(jié)碼掃描檢測器都基于 visitor 模式,F(xiàn)indBugs 實現(xiàn)了這個模式。它提供了這些方法的默認實現(xiàn),在實現(xiàn)自定義檢測器時要覆蓋這些方法。我們將側(cè)重于兩個方法——visit(Code)和sawOpcode(int)。在 FindBugs 分析類時,它會在分析方法內(nèi)容時調(diào)用visit(Code)方法。與此類似,F(xiàn)indBugs 在分析方法正文中的每一個操作碼時調(diào)用sawOpcode(int)方法。

我們以一個最簡單的檢測器findRunInvocations為例簡單說明一下:

該檢測器繼承了BytecodeScanningDetector類,實現(xiàn)了StatelessDetector接口,而BytecodeScanningDetector繼承了DismantleBytecode,實現(xiàn)了頂級父類Detector。

分析多個檢測器之后可以發(fā)現(xiàn)主要的結構層次:

頂級接口Detector是所有檢測器的父類,在此接口下,有實現(xiàn)該接口的多個子類,每個檢測器又根據(jù)自己的檢測目的去實現(xiàn)不同的子類。查看API可以獲取更加清晰的結構層次。

6)在eclipse中,可以自選需要的檢測器:

7)每一個檢測器都有要在findbugs.xml里注冊,如果自實現(xiàn)了檢測器,同樣需要在該文件里注冊進去。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,013評論 25 709
  • 1 背景 一個項目開發(fā)必然會涉及團隊協(xié)作,而工程質(zhì)量就需要團隊去保證。一般我們期望的代碼:無潛在風險、無重復邏輯、...
    zyl06閱讀 3,289評論 5 16
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評論 19 139
  • 摘自http://t.cn/Rfc4sr3 靜態(tài)程序分析(Static program analysis)是指在不...
    許小小晴閱讀 6,691評論 0 8
  • 一會兒即將踏上火車,去另一個城市會友。 想想自己這半年的變化,“宅”這個詞,真的是離自己越來越遠了。 1.走出家門...
    condi的世界閱讀 350評論 2 1

友情鏈接更多精彩內(nèi)容