主流Java靜態檢查工具checkstyle,findbugs,PMD異同點
阿新 • • 發佈:2018-12-19
工作之中遇到了JAVA靜態檢查相關內容,在此以作總結。
目錄
- 靜態檢查概念
- 靜態檢查理論基礎和應用技術
- 主流Java靜態分析工具
- 三者區別
- 三者內建程式設計規範
- 簡單對比
- 總結
靜態檢查概念
靜態程式碼分析是指無需執行被測程式碼,僅通過分析或檢查源程式的語法、 結構、過程、介面等來檢查程式的正確性,找出程式碼隱藏的錯誤和缺陷, 如引數不匹配,有歧義的巢狀語句,錯誤的遞迴,非法計算,可能出現的空指標引用等等。
靜態檢查理論基礎和應用技術
缺陷模式匹配: 事先從程式碼分析經驗中收集足夠多的共性缺陷模式,將待分析程式碼與已有的共 性缺陷模式進行模式匹配,從而完成軟體的安全分析。 這種方式的優點是簡單方便,但要求內建足夠多缺陷模式,且易產生誤報。 型別推斷:
主流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.功能重疊: 在對程式碼缺陷檢查中,幾種工具之間功能也有重疊。