1. 程式人生 > >主流Java靜態檢查工具checkstyle,findbugs,PMD異同點

主流Java靜態檢查工具checkstyle,findbugs,PMD異同點

工作之中遇到了JAVA靜態檢查相關內容,在此以作總結。

目錄

  1. 靜態檢查概念
  2. 靜態檢查理論基礎和應用技術
  3. 主流Java靜態分析工具
  4. 三者區別
  5. 三者內建程式設計規範
  6. 簡單對比
  7. 總結

靜態檢查概念

靜態程式碼分析是指無需執行被測程式碼,僅通過分析或檢查源程式的語法、      結構、過程、介面等來檢查程式的正確性,找出程式碼隱藏的錯誤和缺陷,      如引數不匹配,有歧義的巢狀語句,錯誤的遞迴,非法計算,可能出現的空指標引用等等。

靜態檢查理論基礎和應用技術

    缺陷模式匹配:         事先從程式碼分析經驗中收集足夠多的共性缺陷模式,將待分析程式碼與已有的共         性缺陷模式進行模式匹配,從而完成軟體的安全分析。         這種方式的優點是簡單方便,但要求內建足夠多缺陷模式,且易產生誤報。     型別推斷:

        指通過對程式碼中運算物件型別進行推理,從而保證程式碼中每條語句都針對正確的型別執行。         首先將預定義一套型別機制,包括型別等價等推理規則,而後基於這一規則進行推理計算。         型別推斷可以檢查程式碼中的型別錯誤,簡單,高效,適合程式碼缺陷的快速檢測。     模型檢查:         建立於有限狀態自動機的概念基礎之上,這一理論將被分析程式碼抽象為一個自動機系統,         並且假設該系統是有限狀態的、或者是可以通過抽象歸結為有限狀態。模型檢驗過程中,         首先將被分析程式碼中的每條語句產生的影響抽象為一個有限狀態自動機的一個狀態,         而後通過分析有限狀態機從而達到程式碼分析的目的。         模型檢驗主要適合檢驗程式併發等時序特性,但是對於資料值域資料型別等方面作用較弱。     資料流分析:
        也是一種軟體驗證技術,這種技術通過收集程式碼中引用到的變數資訊,從而分析變數在程式中         的賦值、引用以及傳遞等情況。對資料流進行 分析可以確定變數的定義以及在程式碼中被引用的         情況,同時還能夠檢查程式碼資料流異常,如引用在前賦值在後、只賦值無引用等。         資料流分析主要適合檢驗程式中的 資料域特性。

主流Java靜態分析工具:checkstyle,findbugs,PMD

三者區別 

工具

分析物件

側重

應用技術

Checkstyle

原始檔

格式缺陷

缺陷模式匹配

FindBugs

位元組碼

程式碼缺陷

缺陷模式匹配;資料流分析

PMD

原始碼

程式碼缺陷

缺陷模式匹配

三者內建程式設計規範 

Checkstyle:

Javadoc 註釋 檢查類及方法的Javadoc註釋
命名約定 檢查命名是否符合命名規範
標題 檢查檔案是否以某些行開頭
Import語句 檢查Import語句是否符合定義規範
程式碼塊大小 檢查類、方法等程式碼塊的行數
空白 檢查空白符,如tab,回車符等
修飾符 修飾符號的檢查,如修飾符的定義順序
檢查是否有空塊或無效塊
程式碼問題 檢查重複程式碼,條件判斷,魔數等問題
類設計 檢查類的定義是否符合規範,如建構函式的定義等問題

FindBugs:

Bad practice壞的實踐 常見程式碼錯誤,用於靜態程式碼檢查時進行缺陷模式匹配
Correctness可能導致錯誤的程式碼 如空指標引用等
國際化相關問題 如錯誤的字串轉換
可能受到的惡意攻擊 如訪問許可權修飾符的定義等
多執行緒的正確性 如多執行緒程式設計時常見的同步,執行緒排程問題。
執行時效能問題 如由變數定義,方法呼叫導致的程式碼低效問題。

PMD:

可能的Bugs 檢查潛在程式碼錯誤,如空 try/catch/finally/switch 語句
未使用程式碼(Dead code) 檢查未使用的變數,引數,方法
複雜的表示式 檢查不必要的 if 語句,可被 while 替代的 for 迴圈
重複的程式碼 檢查重複的程式碼
迴圈體建立新物件 檢查在迴圈體內例項化新物件
資源關閉 檢查 Connect,Result,Statement 等資源使用之後是否被關閉掉

簡單對比

程式碼缺陷分類  示例 Checkstyle FindBugs PMD
引用操作 空指標引用
物件操作 物件比較(用==非equals) ×
表示式複雜化 多餘的if語句 × ×
陣列使用 陣列下標越界 × × ×
未使用變數或程式碼段 未使用變數 ×
資源回收  I/O未關閉 × ×
方法呼叫 未使用方法返回值 × ×
程式碼設計 空的try/catch/finally塊 × ×

  總結--應結合實際使用

    1.側重不同:         Checkstyle 側重程式碼編寫格式,編碼規範的檢驗,對程式碼bug的發現較弱。         FindBugs,PMD著重於發現程式碼缺陷,針對的程式碼缺陷類別也各有不同。     2.功能重疊:         在對程式碼缺陷檢查中,幾種工具之間功能也有重疊。