趙 卓, 軟件工程師, IBM 簡介: 本文首先介紹了靜態(tài)代碼分析的基本概念及主要技術,隨后分別介紹了現(xiàn)有 4 種主流 Java 靜態(tài)代碼分析工具 (Checkstyle,F(xiàn)indBugs,PMD,Jtest),最后從功能、特性等方面對它們進行分析和比較,希望能夠幫助 Java 軟件開發(fā)人員了解靜態(tài)代碼分析工具,并選擇合適的工具應用到軟件開發(fā)中。 本文的標簽: java, 分析工具, 常用, 應用開發(fā), 編碼, 調試/測試/調優(yōu), 靜態(tài)代碼分析工具, 靜態(tài)代碼分析工具的分析與比較 在 Java 軟件開發(fā)過程中,開發(fā)團隊往往要花費大量的時間和精力發(fā)現(xiàn)并修改代碼缺陷。Java 靜態(tài)代碼分析(static code analysis)工具能夠在代碼構建過程中幫助開發(fā)人員快速、有效的定位代碼缺陷并及時糾正這些問題,從而極大地提高軟件可靠性并節(jié)省軟件開發(fā)和測試成本。目前市場上的 Java 靜態(tài)代碼分析工具種類繁多且各有千秋,因此本文將分別介紹現(xiàn)有 4 種主流 Java 靜態(tài)代碼分析工具 (Checkstyle,F(xiàn)indBugs,PMD,Jtest),并從功能、特性等方面對它們進行分析和比較,希望能夠幫助 Java 軟件開發(fā)人員了解靜態(tài)代碼分析工具,并選擇合適的工具應用到軟件開發(fā)中。 靜態(tài)代碼分析是指無需運行被測代碼,僅通過分析或檢查源程序的語法、結構、過程、接口等來檢查程序的正確性,找出代碼隱藏的錯誤和缺陷,如參數(shù)不匹配,有歧義的嵌套語句,錯誤的遞歸,非法計算,可能出現(xiàn)的空指針引用等等。 在軟件開發(fā)過程中,靜態(tài)代碼分析往往先于動態(tài)測試之前進行,同時也可以作為制定動態(tài)測試用例的參考。統(tǒng)計證明,在整個軟件開發(fā)生命周期中,30% 至 70% 的代碼邏輯設計和編碼缺陷是可以通過靜態(tài)代碼分析來發(fā)現(xiàn)和修復的。 但是,由于靜態(tài)代碼分析往往要求大量的時間消耗和相關知識的積累,因此對于軟件開發(fā)團隊來說,使用靜態(tài)代碼分析工具自動化執(zhí)行代碼檢查和分析,能夠極大地提高軟件可靠性并節(jié)省軟件開發(fā)和測試成本。 1. 幫助程序開發(fā)人員自動執(zhí)行靜態(tài)代碼分析,快速定位代碼隱藏錯誤和缺陷。 2. 幫助代碼設計人員更專注于分析和解決代碼設計缺陷。 3. 顯著減少在代碼逐行檢查上花費的時間,提高軟件可靠性并節(jié)省軟件開發(fā)和測試成本。
Checkstyle 是 SourceForge 的開源項目,通過檢查對代碼編碼格式,命名約定,Javadoc,類設計等方面進行代碼規(guī)范和風格的檢查,從而有效約束開發(fā)人員更好地遵循代碼編寫規(guī)范。 Checkstyle 提供了支持大多數(shù)常見 IDE 的插件,文本主要使用 Eclipse 中的 Checkstyle 插件。如下圖 1 所示,Checkstyle 對代碼進行編碼風格檢查,并將檢查結果顯示在 Problems 視圖中。圖中,代碼編輯器中每個放大鏡圖標表示一個 Checkstyle 找到的代碼缺陷。開發(fā)人員可通過在 Problems 視圖中查看錯誤或警告詳細信息。 圖 1. 使用 Checkstyle 進行編碼風格檢查 ![]() 此外,Checkstyle 支持用戶根據需求自定義代碼檢查規(guī)范,在下圖 2 中的配置面板中,用戶可以在已有檢查規(guī)范如命名約定,Javadoc,塊,類設計等方面的基礎上添加或刪除自定義檢查規(guī)范。 圖 2. 使用 Checkstyle 添加自定義代碼檢查規(guī)范 ![]() FindBugs 是由馬里蘭大學提供的一款開源 Java 靜態(tài)代碼分析工具。FindBugs 通過檢查類文件或 JAR 文件,將字節(jié)碼與一組缺陷模式進行對比從而發(fā)現(xiàn)代碼缺陷,完成靜態(tài)代碼分析。FindBugs 既提供可視化 UI 界面,同時也可以作為 Eclipse 插件使用。文本將主要使用將 FindBugs 作為 Eclipse 插件。在安裝成功后會在 eclipse 中增加 FindBugs perspective,用戶可以對指定 Java 類或 JAR 文件運行 FindBugs,此時 FindBugs 會遍歷指定文件,進行靜態(tài)代碼分析,并將代碼分析結果顯示在 FindBugs perspective 的 bugs explorer 中,如下圖 3 所示: 圖 3. 使用 FindBugs 進行靜態(tài)代碼分析 ![]() 圖中 Bug Explorer 中的灰色圖標處為 Bug 類型,每種分類下紅色圖標表示 bug 較為嚴重,黃色的圖標表示 bug 為警告程度。Propreties 列出了 bug 的描述信息及修改方案。 此外,F(xiàn)indBugs 還為用戶提供定制 Bug Pattern 的功能。用戶可以根據需求自定義 FindBugs 的代碼檢查條件,如下圖 4 所示: 圖 4. 使用 FindBugs 添加自定義代碼檢查規(guī)范 ![]() PMD 是由 DARPA 在 SourceForge 上發(fā)布的開源 Java 代碼靜態(tài)分析工具。PMD 通過其內置的編碼規(guī)則對 Java 代碼進行靜態(tài)檢查,主要包括對潛在的 bug,未使用的代碼,重復的代碼,循環(huán)體創(chuàng)建新對象等問題的檢驗。PMD 提供了和多種 Java IDE 的集成,例如 Eclipse,IDEA,NetBean 等。本文主要使用 PMD 以插件方式與 Eclipse 集成。如下圖 5 所示:在 Violations Overview 視圖中,按照代碼缺陷嚴重性集中顯示了 PMD 靜態(tài)代碼分析的結果。 圖 5. 使用 PMD 進行靜態(tài)代碼分析 ![]() PMD 同樣也支持開發(fā)人員對代碼檢查規(guī)范進行自定義配置。開發(fā)人員可以在下圖 6 中的面板中添加、刪除、導入、導出代碼檢查規(guī)范。 圖 6. 使用 PMD 添加自定義代碼檢查規(guī)范 ![]() Jtest 是 Parasoft 公司推出的一款針對 Java 語言的自動化代碼優(yōu)化和測試工具,Jtest 的靜態(tài)代碼分析功能能夠按照其內置的超過 800 條的 Java 編碼規(guī)范自動檢查并糾正這些隱蔽且難以修復的編碼錯誤。同時,還支持用戶自定義編碼規(guī)則,幫助用戶預防一些特殊用法的錯誤。Jtest 提供了基于 Eclipse 的插件安裝。Jtest 支持開發(fā)人員對 Java 代碼進行編碼規(guī)范檢查,并在 Jtask 窗口中集中顯示檢查結果,如下圖 7 所示: 圖 7. 使用 Jtest 進行靜態(tài)代碼分析 ![]() 同時,Jtest 還提供了對用戶定制代碼檢查配置甚至自定義編碼規(guī)則的支持,這一功能使得開發(fā)人員可以基于不同場景定制所需要的編碼規(guī)范,如圖 8 所示: 圖 8. 使用 Jtest 添加自定義代碼檢查規(guī)范 ![]() 本章節(jié)將從以下幾個方面對上述 Java 靜態(tài)分析工具進行比較: 下表 1 列出了不同工具的分析對象及應用技術對比: 表 1. 不同工具的分析對象及應用技術對比
Checkstyle:
FindBugs:
PMD:
Jtest
為比較上述 Java 靜態(tài)分析工具的代碼缺陷檢測能力,本文將使用一段示例代碼進行試驗,示例代碼中將涵蓋我們開發(fā)中的幾類常見錯誤,如引用操作、對象操作、表達式復雜化、數(shù)組使用、未使用變量或代碼段、資源回收、方法調用及代碼設計幾個方面。最后本文將分別記錄在默認檢查規(guī)范設置下,不同工具對該示例代碼的分析結果。以下為示例代碼 Test.java。其中,代碼的注釋部分列舉了代碼中可能存在的缺陷。 清單 1. Test.java 示例代碼
通過以上測試代碼,我們對已有 Java 靜態(tài)代碼分析工具的檢驗結果做了如下比較,如下表 2 所示。 表 2. Java 靜態(tài)代碼分析工具對比
由表中可以看出幾種工具對于代碼檢查各有側重。其中,Checkstyle 更偏重于代碼編寫格式,及是否符合編碼規(guī)范的檢驗,對代碼 bug 的發(fā)現(xiàn)功能較弱;而 FindBugs,PMD,Jtest 著重于發(fā)現(xiàn)代碼缺陷。在對代碼缺陷檢查中,這三種工具在針對的代碼缺陷類別也各有不同,且類別之間有重疊。 本文分別從功能、特性和內置編程規(guī)范等方面詳細介紹了包括 Checkstyle,F(xiàn)indBugs,PMD,Jtest 在內的四種主流 Java 靜態(tài)代碼分析工具,并通過一段 Java 代碼示例對這四種工具的代碼分析能力進行比較。由于這四種工具內置編程規(guī)范各有不同,因此它們對不同種類的代碼問題的發(fā)現(xiàn)能力也有所不同。其中 Checkstyle 更加偏重于代碼編寫格式檢查,而 FindBugs,PMD,Jtest 著重于發(fā)現(xiàn)代碼缺陷。最后,希望本文能夠幫助 Java 軟件開發(fā)和測試人員進一步了解以上四種主流 Java 靜態(tài)分析工具,并幫助他們根據需求選擇合適的工具。 |
|
來自: CevenCheng > 《項目調優(yōu)》