版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 10/104種代碼掃描工具分析 簡(jiǎn)介 本文首先介紹了靜態(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ā)中。 引言 在Java 軟件開發(fā)過(guò)程中,開發(fā)團(tuán)隊(duì)往往要花費(fèi)大量的時(shí)間和精力發(fā)現(xiàn)并修改代碼缺陷。Java 靜態(tài)代碼分析(static code analysis)工具能夠在代碼構(gòu)建過(guò)程中幫助開發(fā)人員快速、有效的定位代碼缺陷并及時(shí)糾正這些問(wèn)題,從而極大地提高軟件可靠性
2、并節(jié)省軟件開發(fā)和測(cè)試成本。目前市場(chǎng)上的Java 靜態(tài)代碼分析工具種類繁多且各有千秋,因此本文將分別介紹現(xiàn)有4 種主流Java 靜態(tài)代碼分析工具(Checkstyle,F(xiàn)indBugs,PMD,Jtest),并從功能、特性等方面對(duì)它們進(jìn)行分析和比較,希望能夠幫助Java 軟件開發(fā)人員了解靜態(tài)代碼分析工具,并選擇合適的工具應(yīng)用到軟件開發(fā)中。 靜態(tài)代碼分析工具簡(jiǎn)介 什么是靜態(tài)代碼分析 靜態(tài)代碼分析是指無(wú)需運(yùn)行被測(cè)代碼,僅通過(guò)分析或檢查源程序的語(yǔ)法、結(jié)構(gòu)、過(guò)程、接口等來(lái)檢查程序的正確性,找出代碼隱藏的錯(cuò)誤和缺陷,如參數(shù)不匹配,有歧義的嵌套語(yǔ)句,錯(cuò)誤的遞歸,非法計(jì)算,可能出現(xiàn)的空指針引用等等。 在軟件開
3、發(fā)過(guò)程中,靜態(tài)代碼分析往往先于動(dòng)態(tài)測(cè)試之前進(jìn)行,同時(shí)也可以作為制定動(dòng)態(tài)測(cè)試用例的參考。統(tǒng)計(jì)證明,在整個(gè)軟件開發(fā)生命周期中,30% 至70% 的代碼邏輯設(shè)計(jì)和編碼缺陷是可以通過(guò)靜態(tài)代碼分析來(lái)發(fā)現(xiàn)和修復(fù)的。 但是,由于靜態(tài)代碼分析往往要求大量的時(shí)間消耗和相關(guān)知識(shí)的積累,因此對(duì)于軟件開發(fā)團(tuán)隊(duì)來(lái)說(shuō),使用靜態(tài)代碼分析工具自動(dòng)化執(zhí)行代碼檢查和分析,能夠極大地提高軟件可靠性并節(jié)省軟件開發(fā)和測(cè)試成本。 靜態(tài)代碼分析工具的優(yōu)勢(shì) 1. 幫助程序開發(fā)人員自動(dòng)執(zhí)行靜態(tài)代碼分析,快速定位代碼隱藏錯(cuò)誤和缺陷。 2. 幫助代碼設(shè)計(jì)人員更專注于分析和解決代碼設(shè)計(jì)缺陷。 3. 顯著減少在代碼逐行檢查上花費(fèi)的時(shí)間,提高軟件可靠性
4、并節(jié)省軟件開發(fā)和測(cè)試成本。 Java 靜態(tài)代碼分析理論基礎(chǔ)和主要技術(shù) ?缺陷模式匹配:缺陷模式匹配事先從代碼分析經(jīng)驗(yàn)中收集足夠多的共性缺陷模式,將待分析代碼與已有的共性缺陷模式進(jìn)行模式匹配,從而完成軟 件的安全分析。這種方式的優(yōu)點(diǎn)是簡(jiǎn)單方便,但是要求內(nèi)置足夠多缺陷模 式,且容易產(chǎn)生誤報(bào)。 ?類型推斷:類型推斷技術(shù)是指通過(guò)對(duì)代碼中運(yùn)算對(duì)象類型進(jìn)行推理,從而保證代碼中每條語(yǔ)句都針對(duì)正確的類型執(zhí)行。這種技術(shù)首先將預(yù)定義一套類型機(jī)制,包括類型等價(jià)、類型包含等推理規(guī)則,而后基于這一規(guī)則進(jìn) 行推理計(jì)算。類型推斷可以檢查代碼中的類型錯(cuò)誤,簡(jiǎn)單,高效,適合代碼缺陷的快速檢測(cè)。 ?模型檢查:模型檢驗(yàn)建立于有限狀
5、態(tài)自動(dòng)機(jī)的概念基礎(chǔ)之上,這一理論將被分析代碼抽象為一個(gè)自動(dòng)機(jī)系統(tǒng),并且假設(shè)該系統(tǒng)是有限狀態(tài)的、或者 是可以通過(guò)抽象歸結(jié)為有限狀態(tài)。模型檢驗(yàn)過(guò)程中,首先將被分析代碼 中的每條語(yǔ)句產(chǎn)生的影響抽象為一個(gè)有限狀態(tài)自動(dòng)機(jī)的一個(gè)狀態(tài),而后通過(guò)分析有限狀態(tài)機(jī)從而達(dá)到代碼分析的目的。模型檢驗(yàn)主要適合檢驗(yàn)程 序并發(fā)等時(shí)序特性,但是對(duì)于數(shù)據(jù)值域數(shù)據(jù)類型等方面作用較弱。 ?數(shù)據(jù)流分析:數(shù)據(jù)流分析也是一種軟件驗(yàn)證技術(shù),這種技術(shù)通過(guò)收集代碼中引用到的變量信息,從而分析變量在程序中的賦值、引用以及傳遞等情 況。對(duì)數(shù)據(jù)流進(jìn)行分析可以確定變量的定義以及在代碼中被引用的情況,同時(shí)還能夠檢查代碼數(shù)據(jù)流異常,如引用在前賦值在后、只
6、賦值無(wú)引用等。 數(shù)據(jù)流分析主要適合檢驗(yàn)程序中的數(shù)據(jù)域特性。 現(xiàn)有主流Java 靜態(tài)分析工具 Checkstyle Checkstyle 是SourceForge 的開源項(xiàng)目,通過(guò)檢查對(duì)代碼編碼格式,命名約定,Javadoc,類設(shè)計(jì)等方面進(jìn)行代碼規(guī)范和風(fēng)格的檢查,從而有效約束開發(fā)人員更好地遵循代碼編寫規(guī)范。 Checkstyle 提供了支持大多數(shù)常見IDE 的插件,文本主要使用Eclipse 中的Checkstyle 插件。如下圖1 所示,Checkstyle 對(duì)代碼進(jìn)行編碼風(fēng)格檢查,并將檢查結(jié)果顯示在Problems 視圖中。圖中,代碼編輯器中每個(gè)放大鏡圖標(biāo)表示一個(gè)Checkstyle 找到的
7、代碼缺陷。開發(fā)人員可通過(guò)在Problems 視圖中查看錯(cuò)誤或警告詳細(xì)信息。 圖1. 使用Checkstyle 進(jìn)行編碼風(fēng)格檢查 此外,Checkstyle 支持用戶根據(jù)需求自定義代碼檢查規(guī)范,在下圖2 中的配置面板中,用戶可以在已有檢查規(guī)范如命名約定,Javadoc,塊,類設(shè)計(jì)等方面的基礎(chǔ)上添加或刪除自定義檢查規(guī)范。 圖2. 使用Checkstyle 添加自定義代碼檢查規(guī)范 FindBugs FindBugs 是由馬里蘭大學(xué)提供的一款開源Java 靜態(tài)代碼分析工具。FindBugs 通過(guò)檢查類文件或JAR 文件,將字節(jié)碼與一組缺陷模式進(jìn)行對(duì)比從 而發(fā)現(xiàn)代碼缺陷,完成靜態(tài)代碼分析。FindBug
8、s 既提供可視化UI 界面,同時(shí)也可以作為Eclipse 插件使用。文本將主要使用將FindBugs 作為Eclipse 插件。在安裝成功后會(huì)在eclipse 中增加FindBugs perspective,用戶可以對(duì)指定Java 類或JAR 文件運(yùn)行FindBugs,此時(shí)FindBugs 會(huì)遍歷指定文件,進(jìn)行靜態(tài)代碼分析,并將代碼分析結(jié)果顯示在FindBugs perspective 的bugs explorer 中,如下圖3 所示: 圖3. 使用FindBugs 進(jìn)行靜態(tài)代碼分析 圖中Bug Explorer 中的灰色圖標(biāo)處為Bug 類型,每種分類下紅色圖標(biāo)表示bug 較為嚴(yán)重,黃色的圖標(biāo)
9、表示bug 為警告程度。Propreties 列出了bug 的描述信息及修改方案。 此外,F(xiàn)indBugs 還為用戶提供定制Bug Pattern 的功能。用戶可以根據(jù)需求自定義FindBugs 的代碼檢查條件,如下圖4 所示: 圖4. 使用FindBugs 添加自定義代碼檢查規(guī)范 PMD PMD 是由DARPA 在SourceForge 上發(fā)布的開源Java 代碼靜態(tài)分析工具。PMD 通過(guò)其內(nèi)置的編碼規(guī)則對(duì)Java 代碼進(jìn)行靜態(tài)檢查,主要包括對(duì)潛在的bug,未使用的代碼,重復(fù)的代碼,循環(huán)體創(chuàng)建新對(duì)象等問(wèn)題的檢驗(yàn)。PMD 提供了和多種Java IDE 的集成,例如Eclipse,IDEA,Ne
10、tBean 等。本文主要使用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 添加自定義代碼檢查規(guī)范 Jtest Jtest 是Parasoft 公司推出的一款針對(duì)Java 語(yǔ)言的自動(dòng)化代碼優(yōu)化和測(cè)試工具,Jtest 的靜態(tài)代碼分析功能能夠按照其內(nèi)置的超過(guò)800 條的Java 編碼規(guī)范自動(dòng)檢查并糾正
11、這些隱蔽且難以修復(fù)的編碼錯(cuò)誤。同時(shí),還支持用戶自定義編碼規(guī)則,幫助用戶預(yù)防一些特殊用法的錯(cuò)誤。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 所示: 圖8. 使用Jtest 添加自定義代碼檢查規(guī)范 Java 靜態(tài)分析工具對(duì)比 本章節(jié)將從以下幾個(gè)方面對(duì)上述Java 靜態(tài)分析工具進(jìn)行比較:應(yīng)用技術(shù)及分析
12、對(duì)象 下表1 列出了不同工具的分析對(duì)象及應(yīng)用技術(shù)對(duì)比: 表1. 不同工具的分析對(duì)象及應(yīng)用技術(shù)對(duì)比 Java 靜態(tài)分析工具分析對(duì)象應(yīng)用技術(shù)Checkstyle Java 源文件缺陷模式匹配 FindBugs 字節(jié)碼缺陷模式匹配;數(shù)據(jù)流分析 PMD Java 源代碼缺陷模式匹配 Jtest Java 源代碼缺陷模式匹配;數(shù)據(jù)流分析 內(nèi)置編程規(guī)范 Checkstyle: ?Javadoc 解釋:檢查類及方法的Javadoc 解釋 ?命名約定:檢查命名是否符合命名規(guī)范 ?標(biāo)題:檢查文件是否以某些行開頭 ?Import 語(yǔ)句:檢查Import 語(yǔ)句是否符合定義規(guī)范 ?代碼塊大小,即檢查類、方法等代碼塊的
13、行數(shù) ?空白:檢查空白符,如tab,回車符等 ?修飾符:修飾符號(hào)的檢查,如修飾符的定義順序 ?塊:檢查是否有空塊或無(wú)效塊 ?代碼問(wèn)題:檢查重復(fù)代碼,條件判斷,魔數(shù)等問(wèn)題 ?類設(shè)計(jì):檢查類的定義是否符合規(guī)范,如構(gòu)造函數(shù)的定義等問(wèn)題FindBugs: ?Bad practice 壞的實(shí)踐:常見代碼錯(cuò)誤,用于靜態(tài)代碼檢查時(shí)進(jìn)行缺陷模式匹配 ?Correctness 可能導(dǎo)致錯(cuò)誤的代碼,如空指針引用等 ?國(guó)際化相關(guān)問(wèn)題:如錯(cuò)誤的字符串轉(zhuǎn)換 ?可能受到的惡意攻擊,如訪問(wèn)權(quán)限修飾符的定義等 ?多線程的正確性:如多線程編程時(shí)常見的同步,線程調(diào)度問(wèn)題。 ?運(yùn)行時(shí)性能問(wèn)題:如由變量定義,方法調(diào)用導(dǎo)致的代碼低效問(wèn)
14、題。 PMD: ?可能的Bugs:檢查潛在代碼錯(cuò)誤,如空try/catch/finally/switch 語(yǔ)句?未使用代碼(Dead code):檢查未使用的變量,參數(shù),方法 ?復(fù)雜的表達(dá)式:檢查不必要的if 語(yǔ)句,可被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ò)誤、庫(kù)錯(cuò)誤、邏輯錯(cuò)誤和算法錯(cuò)誤等 ?未使用代碼:檢查未使用的變量,參數(shù),方法 ?初始化錯(cuò)誤:內(nèi)存分配錯(cuò)誤、變量初始化錯(cuò)誤、變
15、量定義沖突 ?命名約定:檢查命名是否符合命名規(guī)范 ?Javadoc 解釋:檢查類及方法的Javadoc 解釋 ?線程和同步:檢驗(yàn)多線程編程時(shí)常見的同步,線程調(diào)度問(wèn)題 ?國(guó)際化問(wèn)題: ?垃圾回收:檢查變量及JDBC 資源是否存在內(nèi)存泄露隱患 錯(cuò)誤檢查能力 為比較上述Java 靜態(tài)分析工具的代碼缺陷檢測(cè)能力,本文將使用一段示例代碼進(jìn)行試驗(yàn),示例代碼中將涵蓋我們開發(fā)中的幾類常見錯(cuò)誤,如引用操作、對(duì)象操作、表達(dá)式復(fù)雜化、數(shù)組使用、未使用變量或代碼段、資源回收、方法調(diào)用及代碼設(shè)計(jì)幾個(gè)方面。最后本文將分別記錄在默認(rèn)檢查規(guī)范設(shè)置下,不同工具對(duì)該示例代碼的分析結(jié)果。以下為示例代碼Test.java。其中,代碼
16、的解釋部分列舉了代碼中可能存在的缺陷。 清單1. Test.java 示例代碼 view source print? package Test; 1 import java.io.*; 2 public class Test 3 /* 4 * Write the bytes from input stream to output stream. 5 * The input stream and output stream are not closed. 6 07 * param is 08 * param os 9 * throws IOException 1 */ 1 1 public bo
17、olean copy(InputStream is, OutputStream os) throws IOException 1 2 int count = 0; 1 3 /缺少空指針判斷 1 4 byte buffer = new byte1024; 1 5 while(count = is.read(buffer) = 0) 1 6 os.write(buffer, 0, count); 1 7 1 8 /未關(guān)閉I/O流 1 9 return true; 2 2 1 /* 2 2 * 23 * param a 24 * param b 2 5 * param ending 2 6 * re
18、turn copy the elements from a to b, and stop when meet element ending 2 7 */ 2 public void copy(String a, String b, String ending) 8 2 9 3 int index; 3 String temp = null; 1 3 /空指針錯(cuò)誤 2 3 System.out.println(temp.length(); 3 3 /未使用變量 4 3 int length=a.length; 5 3 for(index=0; index index+) 6 3 7 3 /多余的
19、if語(yǔ)句 8 3 if(true) 9 4 4 /對(duì)象比較應(yīng)使用equals 1 4 if(temp=ending) 2 4 3 4 break; 4 4 5 4 /缺少數(shù)組下標(biāo)越界檢查 6 4 bindex=temp; 7 4 8 4 9 5 5 1 /* 5 2 * 5 3 * param file 5 4 * return file contents as string; null if file does not exist 5 5 */ 5 6 public void readFile(File file) 5 7 InputStream is = null; 5 8 OutputStream os = null; 5 9 try 6 0 is = new BufferedInputStream(new FileInputStream(file); 6 1 os = new ByteArrayOutputStream(); 6 2 /未使用方法返回值 6 3 copy(is,os); 6 4 is.close(); 6 5 os.close(); 6 6 catch(IOException e) 6 /可能造成I/O流未關(guān)閉 7 6 8 e.printStackTrace(); 6 9 7 finally 7 1 7 2 /空的try/catch/finally塊 7
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 期房屋合同范本
- 鋼材運(yùn)輸合同范本
- 包干工程 合同范本
- 工廠租房合同范本
- 離異安置房轉(zhuǎn)讓合同范本
- 個(gè)人門店合同范本
- 澆混凝土合同范本
- 公共責(zé)任保險(xiǎn)合同范本
- 2024至2030年中國(guó)紗花數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年通信接口轉(zhuǎn)換器項(xiàng)目投資價(jià)值分析報(bào)告
- 新余網(wǎng)約車考證
- 腎淀粉樣變性教學(xué)演示課件
- 《臺(tái)海危機(jī)》課件
- 中醫(yī)基礎(chǔ)論述題
- 軍用飛機(jī)科普知識(shí)講座
- 駕駛員心理測(cè)試題
- 中小學(xué)生勞動(dòng)教育的跨學(xué)科融合案例
- 醫(yī)院內(nèi)肺炎預(yù)防與控制標(biāo)準(zhǔn)操作規(guī)程
- 醫(yī)院消防安全工作考評(píng)與獎(jiǎng)懲制度
- 區(qū)塊鏈技術(shù)在信息安全管理中的應(yīng)用
- 2023-2024學(xué)年福建省廈門市七年級(jí)上冊(cè)期中語(yǔ)文模擬試題(附答案)
評(píng)論
0/150
提交評(píng)論