4種代碼掃描工具分析_第1頁
4種代碼掃描工具分析_第2頁
4種代碼掃描工具分析_第3頁
免費(fèi)預(yù)覽已結(jié)束,剩余23頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、簡介本文首先介紹了靜態(tài)代碼分析的基本概念及主要技術(shù),隨后分別介紹了現(xiàn)有 4 種主流 Java 靜態(tài)代碼分析工具 (Checkstyle,F(xiàn)indBugs,PMD,Jtest),最后從功能、特性等方面對(duì)它們進(jìn)行分析和比較,希望能夠幫助 Java 軟件開發(fā)人員了解靜態(tài)代碼分析工具,并選擇合適的工具應(yīng)用到軟件開發(fā)中。引言在 JavaJava 靜態(tài)代碼分析(staticcodeanalysis)工具能夠在代碼構(gòu)建過程中幫助開發(fā)人員快速、有效的定位場(chǎng)上的 Java 靜態(tài)代碼分析工具種類繁多且各有千秋,因此本文將分別介紹現(xiàn)有 4 種主流 Java 靜態(tài)代碼分析工具 (Checkstyle,F(xiàn)indBugs

2、,PMD,Jtest),并從功能、特性等方面對(duì)它們進(jìn)行分析和比較,希望能夠幫助 Java 軟件開發(fā)人員了解靜態(tài)代碼分析工具,并選擇合適的工具應(yīng)用到軟件開發(fā)中。靜態(tài)代碼分析工具簡介什么是靜態(tài)代碼分析非法計(jì)算,可能出現(xiàn)的空指針引用等等。在軟件開發(fā)過程中,靜態(tài)代碼分析往往先于動(dòng)態(tài)測(cè)試之前進(jìn)行,同時(shí)也可以作為制定動(dòng)態(tài)測(cè)試用例的參考。統(tǒng)計(jì)證明,在整個(gè)軟件開發(fā)生命周期中,30% 至 70% 的代碼邏輯設(shè)計(jì)和編碼缺陷是可以通過靜態(tài)代碼分析來發(fā)現(xiàn)和修復(fù)的。靜態(tài)代碼分析工具的優(yōu)勢(shì)幫助程序開發(fā)人員自動(dòng)執(zhí)行靜態(tài)代碼分析,快速定位代碼隱藏錯(cuò)誤和缺陷。幫助代碼設(shè)計(jì)人員更專注于分析和解決代碼設(shè)計(jì)缺陷。顯著減少在代碼逐行檢

3、查上花費(fèi)的時(shí)間,提高軟件可靠性并節(jié)省軟件開發(fā)和測(cè)試成本。Java 靜態(tài)代碼分析理論基礎(chǔ)和主要技術(shù)單方便,但是要求內(nèi)置足夠多缺陷模式,且容易產(chǎn)生誤報(bào)。一個(gè)狀態(tài),而后通過分析有限狀態(tài)機(jī)從而達(dá)到代碼分析的 目的。模型檢驗(yàn)主要適合檢驗(yàn)程序并發(fā)等時(shí)序特性,但是對(duì)于數(shù)據(jù)值域數(shù)據(jù)類型等方面作用較弱。后、只賦值無引用等。數(shù)據(jù)流分析主要適合檢驗(yàn)程序中的 數(shù)據(jù)域特性?,F(xiàn)有主流 Java 靜態(tài)分析工具CheckstyleCheckstyle 是 SourceForge 的開源項(xiàng)目,通過檢查對(duì)代碼編碼格式,命名約定,Javadoc,類設(shè)計(jì)等方面進(jìn)行代碼規(guī)范和風(fēng)格的檢查,從而有效約束開發(fā)人員更好地遵循代碼編寫規(guī)范。Ch

4、eckstyle 提供了支持大多數(shù)常見 IDE 的插件,文本主要使用 Eclipse 中的 Checkstyle 插件。如下圖 1 所示,Checkstyle 對(duì)代碼進(jìn)行編碼風(fēng)格檢查,并將檢查結(jié)果顯示在 Problems 視圖中。圖中,代碼編輯器中每個(gè)放大鏡圖標(biāo)表示一個(gè) Checkstyle 找到的代碼缺陷。開發(fā)人員可通過在Problems 視圖中查看錯(cuò)誤或警告詳細(xì)信息。圖 1. 使用 Checkstyle 進(jìn)行編碼風(fēng)格檢查此外,Checkstyle 支持用戶根據(jù)需求自定義代碼檢查規(guī)范,在下圖 2 中的配置面板中,用戶可c圖 2. 使用 Checkstyle 添加自定義代碼檢查規(guī)范FindBu

5、gsFindBugs 是由馬里蘭大學(xué)提供的一款開源 JavaFindBugs 通過檢查類文件或 JAR 文件,將字節(jié)碼與一組缺陷模式進(jìn)行對(duì)比從而發(fā)現(xiàn)代碼缺陷,完成靜態(tài)代碼分析。FindBugs 既提供可視化 UI 界面,同時(shí)也可以作為 Eclipse 插件使用。文本將主要使用將FindBugs 作為 Eclipse 插件。在安裝成功后會(huì)在 eclipse 中增加 FindBugsperspective,用戶可以對(duì)指定 Java 類或 JAR 文件運(yùn)行 FindBugs,此時(shí) FindBugs 會(huì)遍歷指定文件,進(jìn)行靜FindBugsperspective 的 bugsexplorer 中,如下圖

6、 3 所示:圖 3. 使用 FindBugs 進(jìn)行靜態(tài)代碼分析圖中 Bug Explorer 中的灰色圖標(biāo)處為 Bug 類型,每種分類下紅色圖標(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ī)則對(duì)

7、 Java 代碼進(jìn)行靜態(tài)檢查,主要包括對(duì)潛在的 bug,未使用的代碼,重復(fù)的代碼, 循環(huán)體創(chuàng)建新對(duì)象等問題的檢驗(yàn)。PMD 提供了和多種 Java IDE 的集成,例如 Eclipse,IDEA, NetBean 等。本文主要使用 PMD 以插件方式與 Eclipse 集成。如下圖 5 所示:在 Violations Overview 視圖中,按照代碼缺陷嚴(yán)重性集中顯示了 PMD 靜態(tài)代碼分析的結(jié)果。圖 5. 使用 PMD 進(jìn)行靜態(tài)代碼分析PMD 同樣也支持開發(fā)人員對(duì)代碼檢查規(guī)范進(jìn)行自定義配置。開發(fā)人員可以在下圖 6 中的面板中添加、刪除、導(dǎo)入、導(dǎo)出代碼檢查規(guī)范。圖 6. 使用 PMD 添加自定

8、義代碼檢查規(guī)范JtestJtest 是 Parasoft 公司推出的一款針對(duì) Java 語言的自動(dòng)化代碼優(yōu)化和測(cè)試工具,Jtest 的靜態(tài)代碼分析功能能夠按照其內(nèi)置的超過 800 條的 Java 編碼規(guī)范自動(dòng)檢查并糾正這些隱蔽且難以Jtest 提供了基于 Eclipse 的插件安裝。Jtest 支持開發(fā)人員對(duì) Java 代碼進(jìn)行編碼規(guī)范檢查,并在 Jtask 窗口中集中顯示檢查結(jié)果,如下圖 7 所示:圖 7. 使用 Jtest 進(jìn)行靜態(tài)代碼分析同時(shí),Jtest 還提供了對(duì)用戶定制代碼檢查配置甚至自定義編碼規(guī)則的支持,這一功能使得開發(fā)人員可以基于不同場(chǎng)景定制所需要的編碼規(guī)范,如圖 8 所示:圖

9、8. 使用 Jtest 添加自定義代碼檢查規(guī)范Java 靜態(tài)分析工具對(duì)比本章節(jié)將從以下幾個(gè)方面對(duì)上述 Java 靜態(tài)分析工具進(jìn)行比較:應(yīng)用技術(shù)及分析對(duì)象下表 1 列出了不同工具的分析對(duì)象及應(yīng)用技術(shù)對(duì)比:表 1. 不同工具的分析對(duì)象及應(yīng)用技術(shù)對(duì)比Java 靜態(tài)分析工具分析對(duì)象應(yīng)用技術(shù)Checkstyle FindBugs PMDJava 源文件缺陷模式匹配字節(jié)碼缺陷模式匹配;數(shù)據(jù)流分析Java 源代碼缺陷模式匹配JtestJava 源代碼缺陷模式匹配;數(shù)據(jù)流分析內(nèi)置編程規(guī)范Checkstyle:Javadoc 注釋:檢查類及方法的 Javadoc 注釋命名約定:檢查命名是否符合命名規(guī)范標(biāo)題:檢查

10、文件是否以某些行開頭Import 語句:檢查 Import 語句是否符合定義規(guī)范代碼塊大小,即檢查類、方法等代碼塊的行數(shù)空白:檢查空白符,如 tab,回車符等修飾符:修飾符號(hào)的檢查,如修飾符的定義順序塊:檢查是否有空塊或無效塊代碼問題:檢查重復(fù)代碼,條件判斷,魔數(shù)等問題類設(shè)計(jì):檢查類的定義是否符合規(guī)范,如構(gòu)造函數(shù)的定義等問題FindBugs:Badpractice 壞的實(shí)踐:常見代碼錯(cuò)誤,用于靜態(tài)代碼檢查時(shí)進(jìn)行缺陷模式匹配Correctness 可能導(dǎo)致錯(cuò)誤的代碼,如空指針引用等國際化相關(guān)問題:如錯(cuò)誤的字符串轉(zhuǎn)換可能受到的惡意攻擊,如訪問權(quán)限修飾符的定義等多線程的正確性:如多線程編程時(shí)常見的同

11、步,線程調(diào)度問題。運(yùn)行時(shí)性能問題:如由變量定義,方法調(diào)用導(dǎo)致的代碼低效問題。PMD:可能的 Bugs:檢查潛在代碼錯(cuò)誤,如空 try/catch/finally/switch 語句未使用代碼(Deadcode):檢查未使用的變量,參數(shù),方法復(fù)雜的表達(dá)式:檢查不必要的 if 語句,可被 while 替代的 for 循環(huán)重復(fù)的代碼:檢查重復(fù)的代碼循環(huán)體創(chuàng)建新對(duì)象:檢查在循環(huán)體內(nèi)實(shí)例化新對(duì)象資源關(guān)閉:檢查 Connect,Result,Statement 等資源使用之后是否被關(guān)閉掉Jtest可能的錯(cuò)誤:如內(nèi)存破壞、內(nèi)存泄露、指針錯(cuò)誤、庫錯(cuò)誤、邏輯錯(cuò)誤和算法錯(cuò)誤等未使用代碼:檢查未使用的變量,參數(shù),方

12、法初始化錯(cuò)誤:內(nèi)存分配錯(cuò)誤、變量初始化錯(cuò)誤、變量定義沖突命名約定:檢查命名是否符合命名規(guī)范Javadoc 注釋:檢查類及方法的 Javadoc 注釋線程和同步:檢驗(yàn)多線程編程時(shí)常見的同步,線程調(diào)度問題國際化問題:垃圾回收:檢查變量及 JDBC 資源是否存在內(nèi)存泄露隱患錯(cuò)誤檢查能力為比較上述 Java 靜態(tài)分析工具的代碼缺陷檢測(cè)能力,本文將使用一段示例代碼進(jìn)行試驗(yàn),示例規(guī)范設(shè)置下,不同工具對(duì)該示例代碼的分析結(jié)果。以下為 示例代碼 Test.java。其中,代碼的注釋部分列舉了代碼中可能存在的缺陷。清單 1. Test.java 示例代碼view source print?p a c k a Te

13、 s t;i m p o r t j a.i o.*;puclass Te st04/*bytes from stream to output stream.The stream and stream not closed.07*p ar am is08*p ar amos* 0thro 9ws IOExc eptio n10*/public boolean 1copy(InputStream1is, OutputStreamos) throws IOException 1in2t count = 0;1/缺斷byte bufferbyte1024;while(count1=5is.read(

14、buffer) = 0) os.w6rite(buffer, 0, count);171/8/未關(guān)閉I/O流19retu rn true;202/ 1*22*2p ar am a2p ar am b* param5ending*return copy 2elements from a 6b, and stop whenmeet elementending2*/7public8void copy(String a, String b, String ending)2930intinde x;temp = null;3/2空指針錯(cuò)誤Syste3m.out.print 3ln(temp.length

15、();3/未4使用變量35intlength=a.le ngth;3x=0;6for(indeindex&a.length; index+)3738/if39if(tru e)404/equals4if(temp=ending) 4344break;454/缺6少 數(shù)組下標(biāo)越界檢查47bindex=t emp;4849 505/ 1*52*5* param3file*return file 5contents as4null if file doesnot exist55 */public 5 readFile(F ilefile) 5m is = null;5 am os = null;59

16、tryis =new6BufferedInputStrea 0m(newFileInputStream(fi le);o6s = new1ByteArrayOutputStream();6/2/未使用方法返回值63copy(is, os);64is.close ();65os.close();6 catch6(IOException e) 6可7I/O未關(guān)閉6e.pr8intStackTrace();6970f inall y717/空的2try/catch/finally 塊73747 5通過以上測(cè)試代碼,我們對(duì)已有 Java 靜態(tài)代碼分析工具的檢驗(yàn)結(jié)果做了如下比較,如下表 2 所示。表 2. Java 靜態(tài)代碼分析工具對(duì)比代碼缺陷分類示例CheckstyleFindBugsPMDJtest引用操作空指針引用對(duì)象操作對(duì)象比較(使用 = 而不是equals)表達(dá)式復(fù)雜化多余的 if 語句數(shù)組使用未使用變量或代碼段數(shù)組下標(biāo)越界未使用變量資源回收方法調(diào)用代碼設(shè)計(jì)I/O未 關(guān)閉未使用方法返回值空 的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論