版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、本文首先介紹了靜態(tài)代碼分析的基本概念及主要技術(shù),隨后分別介紹了現(xiàn)有 4 種主流 Java 靜態(tài)代碼分析工具 (Checkstyle,F(xiàn)indBugs,PMD,Jtest),最后從功能、特性等方面對它們進行分析和比較,希望能夠幫助 Java 軟件開發(fā)人員了解靜態(tài)代碼分析工具,并選擇合適的工具應(yīng)用到軟件開發(fā)中。引言在 Java 軟件開發(fā)過程中,開發(fā)團隊往往要花費大量的時間和精力發(fā)現(xiàn)并修改代碼缺陷。Java 靜態(tài)代碼分析(static code analysis)工具能夠在代碼構(gòu)建過程中幫助開發(fā)人員快速、有效的定位代碼缺陷并及時糾正這些問題,從而極大地提高軟件可靠性并節(jié)省軟件開發(fā)和測試成 本。目前市
2、場上的 Java 靜態(tài)代碼分析工具種類繁多且各有千秋,因此本文將分別介紹現(xiàn)有 4 種主流 Java 靜態(tài)代碼分析工具 (Checkstyle,F(xiàn)indBugs,PMD,Jtest),并從功能、特性等方面對它們進行分析和比較,希望能夠幫助 Java 軟件開發(fā)人員了解靜態(tài)代碼分析工具,并選擇合適的工具應(yīng)用到軟件開發(fā)中。靜態(tài)代碼分析工具簡介什么是靜態(tài)代碼分析靜態(tài)代碼分析是指無需運行被測代碼,僅通過分析或檢查源程序的語法、結(jié)構(gòu)、過程、接口等來檢查程序的正確性,找出代碼隱藏的錯誤和缺陷,如參數(shù)不匹配,有歧義的嵌套語句,錯誤的遞歸,非法計算,可能出現(xiàn)的空指針引用等等。在軟件開發(fā)過程中,靜態(tài)代碼分析往往先于
3、動態(tài)測試之前進行,同時也可以作為制定動態(tài)測試用例的參考。統(tǒng)計證明,在整個軟件開發(fā)生命周期中,30% 至 70% 的代碼邏輯設(shè)計和編碼缺陷是可以通過靜態(tài)代碼分析來發(fā)現(xiàn)和修復(fù)的。但是,由于靜態(tài)代碼分析往往要求大量的時間消耗和相關(guān)知識的積累,因此對于軟件開發(fā)團隊來說,使用靜態(tài)代碼分析工具自動化執(zhí)行代碼檢查和分析,能夠極大地提高軟件可靠性并節(jié)省軟件開發(fā)和測試成本。靜態(tài)代碼分析工具的優(yōu)勢1. 幫助程序開發(fā)人員自動執(zhí)行靜態(tài)代碼分析,快速定位代碼隱藏錯誤和缺陷。2. 幫助代碼設(shè)計人員更專注于分析和解決代碼設(shè)計缺陷。3. 顯著減少在代碼逐行檢查上花費的時間,提高軟件可靠性并節(jié)省軟件開發(fā)和測試成本。Java 靜
4、態(tài)代碼分析理論基礎(chǔ)和主要技術(shù)· 缺陷模式匹配:缺陷模式匹配事先從代碼分析經(jīng)驗中收集足夠多的共性缺陷模式,將待分析代碼與已有的共性缺陷模式進行模式匹配,從而完成軟件的安全分析。這種方式的優(yōu)點是簡單方便,但是要求內(nèi)置足夠多缺陷模式,且容易產(chǎn)生誤報。· 類型推斷:類型推斷技術(shù)是指通過對代碼中運算對象類型進行推理,從而保證代碼中每條語句都針對正確的類型執(zhí)行。這種技術(shù)首先將預(yù)定義一套類型機制,包括類 型等價、類型包含等推理規(guī)則,而后基于這一規(guī)則進行推理計算。類型推斷可以檢查代碼中的類型錯誤,簡單,高效,適合代碼缺陷的快速檢測。· 模型檢查:模型檢驗建立于有限狀態(tài)自動機的概念
5、基礎(chǔ)之上,這一理論將被分析代碼抽象為一個自動機系統(tǒng),并且假設(shè)該系統(tǒng)是有限狀態(tài)的、或者是可以通過抽象歸 結(jié)為有限狀態(tài)。模型檢驗過程中,首先將被分析代碼中的每條語句產(chǎn)生的影響抽象為一個有限狀態(tài)自動機的一個狀態(tài),而后通過分析有限狀態(tài)機從而達到代碼分析的 目的。模型檢驗主要適合檢驗程序并發(fā)等時序特性,但是對于數(shù)據(jù)值域數(shù)據(jù)類型等方面作用較弱。· 數(shù)據(jù)流分析:數(shù)據(jù)流分析也是一種軟件驗證技術(shù),這種技術(shù)通過收集代碼中引用到的變量信息,從而分析變量在程序中的賦值、引用以及傳遞等情況。對數(shù)據(jù)流進行 分析可以確定變量的定義以及在代碼中被引用的情況,同時還能夠檢查代碼數(shù)據(jù)流異常,如引用在前賦值在后、只賦值無
6、引用等。數(shù)據(jù)流分析主要適合檢驗程序中的 數(shù)據(jù)域特性?,F(xiàn)有主流 Java 靜態(tài)分析工具CheckstyleCheckstyle 是 SourceForge 的開源項目,通過檢查對代碼編碼格式,命名約定,Javadoc,類設(shè)計等方面進行代碼規(guī)范和風(fēng)格的檢查,從而有效約束開發(fā)人員更好地遵循代碼編寫規(guī)范。Checkstyle 提供了支持大多數(shù)常見 IDE 的插件,文本主要使用 Eclipse 中的 Checkstyle 插件。如下圖 1 所示,Checkstyle 對代碼進行編碼風(fēng)格檢查,并將檢查結(jié)果顯示在 Problems 視圖中。圖中,代碼編輯器中每個放大鏡圖標(biāo)表示一個 Checkstyle 找到
7、的代碼缺陷。開發(fā)人員可通過在 Problems 視圖中查看錯誤或警告詳細(xì)信息。圖 1. 使用 Checkstyle 進行編碼風(fēng)格檢查此外,Checkstyle 支持用戶根據(jù)需求自定義代碼檢查規(guī)范,在下圖 2 中的配置面板中,用戶可以在已有檢查規(guī)范如命名約定,Javadoc,塊,類設(shè)計等方面的基礎(chǔ)上添加或刪除自定義檢查規(guī)范。圖 2. 使用 Checkstyle 添加自定義代碼檢查規(guī)范FindBugsFindBugs 是由馬里蘭大學(xué)提供的一款開源 Java 靜態(tài)代碼分析工具。FindBugs 通過檢查類文件或 JAR 文件,將字節(jié)碼與一組缺陷模式進行對比從而發(fā)現(xiàn)代碼缺陷,完成靜態(tài)代碼分析。Find
8、Bugs 既提供可視化 UI 界面,同時也可以作為 Eclipse 插件使用。文本將主要使用將 FindBugs 作為 Eclipse 插件。在安裝成功后會在 eclipse 中增加 FindBugs perspective,用戶可以對指定 Java 類或 JAR 文件運行 FindBugs,此時 FindBugs 會遍歷指定文件,進行靜態(tài)代碼分析,并將代碼分析結(jié)果顯示在 FindBugs perspective 的 bugs explorer 中,如下圖 3 所示:圖 3. 使用 FindBugs 進行靜態(tài)代碼分析圖中 Bug Explorer 中的灰色圖標(biāo)處為 Bug 類型,每種分類下紅色
9、圖標(biāo)表示 bug 較為嚴(yán)重,黃色的圖標(biāo)表示 bug 為警告程度。Propreties 列出了 bug 的描述信息及修改方案。此外,F(xiàn)indBugs 還為用戶提供定制 Bug Pattern 的功能。用戶可以根據(jù)需求自定義 FindBugs 的代碼檢查條件,如下圖 4 所示:圖 4. 使用 FindBugs 添加自定義代碼檢查規(guī)范PMDPMD 是由 DARPA 在 SourceForge 上發(fā)布的開源 Java 代碼靜態(tài)分析工具。PMD 通過其內(nèi)置的編碼規(guī)則對 Java 代碼進行靜態(tài)檢查,主要包括對潛在的 bug,未使用的代碼,重復(fù)的代碼,循環(huán)體創(chuàng)建新對象等問題的檢驗。PMD 提供了和多種 Ja
10、va IDE 的集成,例如 Eclipse,IDEA,NetBean 等。本文主要使用 PMD 以插件方式與 Eclipse 集成。如下圖 5 所示:在 Violations Overview 視圖中,按照代碼缺陷嚴(yán)重性集中顯示了 PMD 靜態(tài)代碼分析的結(jié)果。圖 5. 使用 PMD 進行靜態(tài)代碼分析PMD 同樣也支持開發(fā)人員對代碼檢查規(guī)范進行自定義配置。開發(fā)人員可以在下圖 6 中的面板中添加、刪除、導(dǎo)入、導(dǎo)出代碼檢查規(guī)范。圖 6. 使用 PMD 添加自定義代碼檢查規(guī)范JtestJtest 是 Parasoft 公司推出的一款針對 Java 語言的自動化代碼優(yōu)化和測試工具,Jtest 的靜態(tài)代碼
11、分析功能能夠按照其內(nèi)置的超過 800 條的 Java 編碼規(guī)范自動檢查并糾正這些隱蔽且難以修復(fù)的編碼錯誤。同時,還支持用戶自定義編碼規(guī)則,幫助用戶預(yù)防一些特殊用法的錯誤。Jtest 提供了基于 Eclipse 的插件安裝。Jtest 支持開發(fā)人員對 Java 代碼進行編碼規(guī)范檢查,并在 Jtask 窗口中集中顯示檢查結(jié)果,如下圖 7 所示:圖 7. 使用 Jtest 進行靜態(tài)代碼分析同時,Jtest 還提供了對用戶定制代碼檢查配置甚至自定義編碼規(guī)則的支持,這一功能使得開發(fā)人員可以基于不同場景定制所需要的編碼規(guī)范,如圖 8 所示:圖 8. 使用 Jtest 添加自定義代碼檢查規(guī)范Java 靜態(tài)分
12、析工具對比本章節(jié)將從以下幾個方面對上述 Java 靜態(tài)分析工具進行比較:應(yīng)用技術(shù)及分析對象下表 1 列出了不同工具的分析對象及應(yīng)用技術(shù)對比:表 1. 不同工具的分析對象及應(yīng)用技術(shù)對比Java 靜態(tài)分析工具分析對象應(yīng)用技術(shù)Checkstyle Java 源文件缺陷模式匹配FindBugs 字節(jié)碼缺陷模式匹配;數(shù)據(jù)流分析PMD Java 源代碼缺陷模式匹配Jtest Java 源代碼缺陷模式匹配;數(shù)據(jù)流分析內(nèi)置編程規(guī)范Checkstyle:· Javadoc 注釋:檢查類及方法的 Javadoc 注釋· 命名約定:檢查命名是否符合命名規(guī)范· 標(biāo)題:檢查文件是否以某些行
13、開頭· Import 語句:檢查 Import 語句是否符合定義規(guī)范· 代碼塊大小,即檢查類、方法等代碼塊的行數(shù)· 空白:檢查空白符,如 tab,回車符等· 修飾符:修飾符號的檢查,如修飾符的定義順序· 塊:檢查是否有空塊或無效塊· 代碼問題:檢查重復(fù)代碼,條件判斷,魔數(shù)等問題· 類設(shè)計:檢查類的定義是否符合規(guī)范,如構(gòu)造函數(shù)的定義等問題FindBugs:· Bad practice 壞的實踐:常見代碼錯誤,用于靜態(tài)代碼檢查時進行缺陷模式匹配· Correctness 可能導(dǎo)致錯誤的代碼,如空指針引用等
14、183; 國際化相關(guān)問題:如錯誤的字符串轉(zhuǎn)換· 可能受到的惡意攻擊,如訪問權(quán)限修飾符的定義等· 多線程的正確性:如多線程編程時常見的同步,線程調(diào)度問題。· 運行時性能問題:如由變量定義,方法調(diào)用導(dǎo)致的代碼低效問題。PMD:· 可能的 Bugs:檢查潛在代碼錯誤,如空 try/catch/finally/switch 語句· 未使用代碼(Dead code):檢查未使用的變量,參數(shù),方法· 復(fù)雜的表達式:檢查不必要的 if 語句,可被 while 替代的 for 循環(huán)· 重復(fù)的代碼:檢查重復(fù)的代碼· 循環(huán)體創(chuàng)建新對象
15、:檢查在循環(huán)體內(nèi)實例化新對象· 資源關(guān)閉:檢查 Connect,Result,Statement 等資源使用之后是否被關(guān)閉掉Jtest· 可能的錯誤:如內(nèi)存破壞、內(nèi)存泄露、指針錯誤、庫錯誤、邏輯錯誤和算法錯誤等· 未使用代碼:檢查未使用的變量,參數(shù),方法· 初始化錯誤:內(nèi)存分配錯誤、變量初始化錯誤、變量定義沖突· 命名約定:檢查命名是否符合命名規(guī)范· Javadoc 注釋:檢查類及方法的 Javadoc 注釋· 線程和同步:檢驗多線程編程時常見的同步,線程調(diào)度問題· 國際化問題:· 垃圾回收:檢查變量及
16、JDBC 資源是否存在內(nèi)存泄露隱患錯誤檢查能力為比較上述 Java 靜態(tài)分析工具的代碼缺陷檢測能力,本文將使用一段示例代碼進行試驗,示例代碼中將涵蓋我們開發(fā)中的幾類常見錯誤,如引用操作、對象操作、表達式復(fù)雜化、數(shù) 組使用、未使用變量或代碼段、資源回收、方法調(diào)用及代碼設(shè)計幾個方面。最后本文將分別記錄在默認(rèn)檢查規(guī)范設(shè)置下,不同工具對該示例代碼的分析結(jié)果。以下為 示例代碼 Test.java。其中,代碼的注釋部分列舉了代碼中可能存在的缺陷。清單 1. Test.java 示例代碼01packageTest; 02importjava.io.*; 03publicclassTest 04 &
17、#160; /* 05 * Write the bytes from input stream to output stream. 06 * The input stream and output stream are not closed. 07 * param is 08 * param os 09
18、60; * throws IOException 10 */11 public booleancopy(InputStream is, OutputStream os) throwsIOException 12 intcount = 0; 13 /缺少空指針判斷 14
19、60; byte buffer = newbyte1024; 15 while(count = is.read(buffer) >= 0) 16 os.write(buffer, 0, count); 17
20、; 18 /未關(guān)閉I/O流 19 returntrue; 20 21 /* 22 * 23 * param a 24 *
21、 param b 25 * param ending 26 * return copy the elements from a to b, and stop when meet element ending 27 */28 publicvoidcopy(String a, String b, String ending) 29 3
22、0 intindex; 31 String temp = null; 32 /空指針錯誤 33 System.out.println(temp.length(); 34
23、0; /未使用變量 35 intlength=a.length; 36 for(index=0; index&a.length; index+) 37 38 /多余的if語句 39 if(true) 40 41
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 狼獲獎?wù)n件教學(xué)課件
- 統(tǒng)計分析軟件模擬試題三及答案
- 飛向太空的航程說課稿
- 隊列口令說課稿
- 適合小班課件教學(xué)課件
- 怎樣評價課件教學(xué)課件
- 南京工業(yè)大學(xué)浦江學(xué)院《公益營銷》2021-2022學(xué)年第一學(xué)期期末試卷
- 南京工業(yè)大學(xué)浦江學(xué)院《籌資原理和技巧》2022-2023學(xué)年第一學(xué)期期末試卷
- 秸稈打捆協(xié)議書(2篇)
- 南京工業(yè)大學(xué)《應(yīng)用統(tǒng)計學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 人教版(2024)七年級地理上冊5.1《人口與人種》精美課件
- 新蘇教版三年級上冊科學(xué)全冊知識點
- 2024版專升本宣講課件完整版
- 2025數(shù)學(xué)步步高大一輪復(fù)習(xí)講義人教A版復(fù)習(xí)講義含答案
- 車站調(diào)度員技能大賽理論考試題庫(單選、多選題)
- 2024-2030年樺樹汁行業(yè)市場現(xiàn)狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 創(chuàng)新創(chuàng)業(yè)心智模式探索智慧樹知到期末考試答案章節(jié)答案2024年天津農(nóng)學(xué)院
- 2024年九年級化學(xué)上冊 第6單元 碳和碳的氧化物教案 (新版)新人教版
- 2024詳解新版《公司法》課件
- 醫(yī)院法律、法規(guī)培訓(xùn)課件
- 2024年高考作文真題解讀(立意+提綱+范文+總評)
評論
0/150
提交評論