java代碼缺陷自動(dòng)分析工具_(dá)第1頁(yè)
java代碼缺陷自動(dòng)分析工具_(dá)第2頁(yè)
java代碼缺陷自動(dòng)分析工具_(dá)第3頁(yè)
java代碼缺陷自動(dòng)分析工具_(dá)第4頁(yè)
java代碼缺陷自動(dòng)分析工具_(dá)第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、FindBugs 是什么?FindBugs是一個(gè)java bytecode靜態(tài)分析工具,它可以幫助java工程師提高代碼質(zhì)量以及 排除隱含的缺陷。FindBugs檢查類或者JAR文件,將字節(jié)碼與一組缺陷模式進(jìn)行對(duì)比以發(fā)現(xiàn)可能的問(wèn)題。有了靜態(tài)分析工具,就可以在不實(shí)際運(yùn)行程序的情況對(duì)軟件進(jìn)行分析。FindBugs不是通過(guò)分 析類文件的形式或結(jié)構(gòu)來(lái)確定程序的意圖,而是通常使用 Visitor 模式進(jìn)行分析。FindBugs 可以做什么?FindBugs 提供了 35個(gè)檢測(cè)器來(lái)檢測(cè)字節(jié)碼中可能的缺陷。可以做的事情主要有:找出 hash equals 不匹配找與 equals() 和 hashCode(

2、) 的實(shí)現(xiàn)相關(guān)的幾個(gè)問(wèn)題。這兩個(gè)方法非常重要,因?yàn)閹缀跛?有基于集合的類-List、Map、Set 等都調(diào)用它們。一般來(lái)說(shuō),這個(gè)檢測(cè)器尋找兩種不同類 型的問(wèn)題:當(dāng)一個(gè)類重寫(xiě)對(duì)象的 equals() 方法,但是沒(méi)有重寫(xiě)它的 hashCode 方法,或者相反的情 況時(shí)。定義一個(gè) co-variant 版本的 equals() 或 compareTo() 方法。例如, Bob 類定義其 equals() 方法為布爾 equals(Bob) ,它覆蓋了對(duì)象中定義的 equals() 方法。因?yàn)?Java 代 碼在編譯時(shí)解析重載方法的方式,在運(yùn)行時(shí)使用的幾乎總是在對(duì)象中定義的這個(gè)版本的方法, 而不是在

3、Bob 中定義的那一個(gè)(除非顯式將 equals() 方法的參數(shù)強(qiáng)制轉(zhuǎn)換為 Bob 類型)。 因此,當(dāng)這個(gè)類的一個(gè)實(shí)例放入到類集合中的任何一個(gè)中時(shí),使用的是 Object.equals() 版 本的方法,而不是在 Bob 中定義的版本。在這種情況下, Bob 類應(yīng)當(dāng)定義一個(gè)接受類型為 Object 的參數(shù)的 equals() 方法。檢測(cè):忽略方法返回值 這個(gè)檢測(cè)器查找代碼中忽略了不應(yīng)該忽略的方法返回值的地方。這種情況的一個(gè)常見(jiàn)例子是 在調(diào)用 String 方法時(shí),例如:String aString = bob;b.replace(b, p);if(b.equals(pop)這個(gè)錯(cuò)誤很常見(jiàn)。在第

4、2行,程序員認(rèn)為他已經(jīng)用p替換了字符串中的所有b。確實(shí)是這 樣,但是他忘記了字符串是不可變的。所有這類方法都返回一個(gè)新字符串,而從來(lái)不會(huì)改變 消息的接收者。檢測(cè):Null指針對(duì)null的解引用(dereference)和冗余比較 這個(gè)檢測(cè)器查找兩類問(wèn)題。它查找代碼路徑將會(huì)或者可能造成 null 指針異常的情況,它還 查找對(duì)null的冗余比較的情況。例如,如果兩個(gè)比較值都為null,那么它們就是冗余的并 可能表明代碼錯(cuò)誤。FindBugs在可以確定一個(gè)值為null而另一個(gè)值不為null時(shí),檢測(cè)類 似的錯(cuò)誤,例如:Person person = aMap.get(bob);if (person !

5、= null) person.updateAccessTime();String name = person.getName();在這個(gè)例子中,如果第1行的Map不包括一個(gè)名為“bob”的人,那么在第5行詢問(wèn)person 的名字時(shí)就會(huì)出現(xiàn)null指針異常。因?yàn)镕indBugs不知道m(xù)ap是否包含“bob”,所以它將 第 5 行標(biāo)記為可能 null 指針異常。檢測(cè):初始化之前讀取字段 這個(gè)檢測(cè)器尋找在構(gòu)造函數(shù)中初始化之前被讀取的字段。這個(gè)錯(cuò)誤通常是由使用字段名而不 是構(gòu)造函數(shù)參數(shù)引起的,例如在構(gòu)造函數(shù)中讀取未初始化的字段:public class Thing private List actio

6、ns;public Thing(String startingActions) StringTokenizer tokenizer = new StringTokenizer(startingActions);while (tokenizer.hasMoreTokens() actions.add(tokenizer.nextToken();在這個(gè)例子中,第 6 行將產(chǎn)生一個(gè) null 指針異常,因?yàn)樽兞?actions 還沒(méi)有初始化。命名檢查對(duì)標(biāo)準(zhǔn) Java 命令規(guī)范的測(cè)試:變量名稱不應(yīng)太短;方法名稱不應(yīng)過(guò)長(zhǎng);類名稱應(yīng)當(dāng)以小寫(xiě) 字母開(kāi)頭;方法和字段名應(yīng)當(dāng)以小寫(xiě)字母開(kāi)頭,等等。未使用的代碼檢查

7、 查找從未使用的私有字段和本地變量、執(zhí)行不到的語(yǔ)句、從未調(diào)用的私有方法,等等。嵌套檢查例如: switch 語(yǔ)句應(yīng)當(dāng)有 default 塊,應(yīng)當(dāng)避免深度嵌套的 if 塊,不應(yīng)當(dāng)給參數(shù)重新賦 值,不應(yīng)該對(duì) double 值進(jìn)行相等比較。導(dǎo)入語(yǔ)句檢查檢查 import 語(yǔ)句的問(wèn)題,比如同一個(gè)類被導(dǎo)入兩次或者被導(dǎo)入 java.lang 的類中。JUnit 測(cè)試檢查查找測(cè)試用例和測(cè)試方法的特定問(wèn)題,例如方法名稱的正確拼寫(xiě),以及 suite() 方法是不是 static 和 public。字符串檢查 找出處理字符串時(shí)遇到的常見(jiàn)問(wèn)題,例如重復(fù)的字符串標(biāo)量,調(diào)用 String 構(gòu)造函數(shù),對(duì) String 變

8、量調(diào)用 toString() 方法。括號(hào)檢查檢查 for、 if、 while 和 else 語(yǔ)句是否使用了括號(hào)。代碼尺寸檢查 測(cè)試過(guò)長(zhǎng)的方法、有太多方法的類以及重構(gòu)方面的類似問(wèn)題。終結(jié)函數(shù)檢查因?yàn)樵?Java 語(yǔ)言中, finalize() 方法不是那么普遍,它們的使用規(guī)則雖然很詳細(xì),但是 人們對(duì)它們相對(duì)不是很熟悉。這類檢查查找 finalize() 方法的各種問(wèn)題,例如空的終結(jié)函 數(shù),調(diào)用其他方法的 finalize() 方法,對(duì) finalize() 的顯式調(diào)用,等等??寺z查用于 clone() 方法的新規(guī)則。凡是重寫(xiě) clone() 方法的類都必須實(shí)現(xiàn) Cloneable,clone

9、() 方 法 應(yīng) 該 調(diào) 用 super.clone() , 而 clone() 方 法 應(yīng) 該 聲 明 拋 出 CloneNotSupportedException 異常,即使實(shí)際上沒(méi)有拋出異常,也要如此。耦合檢查 查找類之間過(guò)度耦合的跡象,比如導(dǎo)入內(nèi)容太多;在超類型或接口就已經(jīng)夠用的時(shí)候使用子 類的類型;類中的字段、變量和返回類型過(guò)多等。異常檢查針對(duì)異常的檢查:不應(yīng)該聲明該方法而拋出 java.lang.Exception 異常,不應(yīng)當(dāng)將異常用于 流控制,不應(yīng)該捕獲Throwable,等等。日志檢查查找java.util.logging.Logger的不當(dāng)使用,包括非終狀態(tài)(nonfina

10、l)、非靜態(tài)的記錄器, 以及在一個(gè)類中有多個(gè)記錄器。OpenClose 檢查檢查文件或通訊方面,是否忘記 Close 的情況。其它檢查其它缺陷清單可參見(jiàn):缺陷清單構(gòu)建自己的規(guī)則集可以構(gòu)建自己的規(guī)則集準(zhǔn)備使用 FindBugsFindBugs 目前最新版本是 0.9.3。文件名是:findbugs-0.9.3.zip ( Windows)或 findbugs-0.9.3. tar.gz (Unix)。(下載網(wǎng)頁(yè))也可以到 StarTeam 取相應(yīng)安裝文件到本地,將它解壓縮到所選的目錄中,安裝就完成了。要運(yùn)行FindBugs,需要一個(gè)版本1.4或者更高的Java Development Kit (

11、JDK)。安裝完后,要增加兩個(gè)環(huán)境變量:FINDBUGS_HOME,例如:FINDBUGS_HOME =D:findbugs-0.9.3JAVA_HOME,例如:JAVA_HOME=D:j2sdkl.4.2_O6在 FindBugs 主目錄中,有幾個(gè)值得注意的目錄。文檔在 doc 目錄中,但是對(duì)我們來(lái)說(shuō)更重 要的是 bin 目錄,該包含了運(yùn)行 FindBugs 的批處理文件。運(yùn)行 FindBugs像如今的大多數(shù)數(shù)工具一樣,可以以多種方式運(yùn)行FindBugs從GUI、從命令行、使用 Ant、作為Eclipse插件程序和使用Maven。這里將重點(diǎn)提及從GUI運(yùn)行FindBugs,簡(jiǎn)要提及使用Ant

12、和命令行運(yùn)行。FindBugs UI使用 FindBugs UI 很直觀。使用 FindBugs UI 的一個(gè)好處是對(duì)每一個(gè)檢測(cè)到的問(wèn)題提供了 說(shuō)明,圖 1 顯示了缺陷 Test 的說(shuō)明。圖一:項(xiàng)目 Test 的缺陷說(shuō)明對(duì)每一種缺陷模式提供了類似的說(shuō)明。窗口下面的 Source code 選項(xiàng)卡很有用。如果告訴 FindBugs 在什么地方尋找代碼,它就會(huì)在轉(zhuǎn)換到相應(yīng)的選項(xiàng)卡時(shí)突出顯示有問(wèn)題的那一行圖一中的上部有根據(jù)不同類別來(lái)檢查缺陷的選項(xiàng),選項(xiàng)有(By Class、By Package、By Bug Type、 By Bug Category)。圖二是【file】選項(xiàng),主要功能有:創(chuàng)建新項(xiàng)目

13、、打開(kāi)/關(guān)閉項(xiàng)目、儲(chǔ)存項(xiàng)目、儲(chǔ)存Bugs信 息、裝載 Buugs 信息圖三是【View】選項(xiàng),這些選項(xiàng)很有用,可以切換不同模式的視圖。圖四是【Settings】選項(xiàng),是對(duì)檢測(cè)的缺陷模式進(jìn)行選擇。圖五是【創(chuàng)建新項(xiàng)目】選項(xiàng)使用 FindBugs UI 步驟 第一次使用(1)依照?qǐng)D五【創(chuàng)建新項(xiàng)目】選項(xiàng)說(shuō)明,先創(chuàng)建新項(xiàng)目,輸入被檢查的 class 或 jar路徑、java源文件路徑及程序運(yùn)行依賴的class或jar路徑(2)按【FingBugs】按鈕開(kāi)始檢查(3)如果出現(xiàn)下圖六的警告說(shuō)明程序運(yùn)行依賴的class或jar路徑不對(duì)或依賴文件不完整,應(yīng)依據(jù)警告信息完善。(4)按【0K】后即進(jìn)入上圖一的錯(cuò)誤信

14、息顯示(5)選擇【file】?jī)?chǔ)存新建的項(xiàng)目(6)選擇【file】?jī)?chǔ)存新掃描的Bugs信息(xml文件)非第一次使用(1)選擇【file】裝載上次新建的項(xiàng)目并運(yùn)行(2)也可以選擇【file】裝載上次儲(chǔ)存的Bugs信息來(lái)查看值得一提的還有在將 FinBugs 作為 Ant 任務(wù)或者在命令行中運(yùn)行 FindBugs 時(shí),選擇 xml 作為ouput選項(xiàng),可以將上一次運(yùn)行的結(jié)果裝載到UI中。這樣做是同時(shí)利用基于命令行的 工具和 UI 工具的優(yōu)點(diǎn)的一個(gè)很好的方法。FindBugs 作為 Ant 任務(wù)如何在Ant編譯腳本中使用FindBugs?首先將FindBugs Ant任務(wù)拷貝到Ant的lib目 錄中

15、,這樣 Ant 就知道新的任務(wù)。將 FIND_BUGS_HOMElibFindBugs-ant.jar 拷貝到 ANT_HOMElib?,F(xiàn)在看看在編譯腳本中要加入什么才能使用 FindBugs 任務(wù)。因?yàn)?FindBugs 是一個(gè)自定義 任務(wù),將需要使用 taskdef 任務(wù)以使 Ant 知道裝載哪一個(gè)類。通過(guò)在編譯文件中加入以下一行: 在定義了 taskdef 后,可以用它的名字 FindBugs 引用它。下一步要在編譯中加入使用新任 務(wù)的目標(biāo),示例如下:第 1 行: 注意 target 取決于編譯。一定要記住處理的是類文件而 不 是源文件,這樣使target對(duì)應(yīng)于編譯目標(biāo)保證了 FindB

16、ugs可在最新的類文件運(yùn)行。FindBugs可以靈活地接 受多種輸入,包括一組類文件、JAR文件、或者一組目錄。第 2 行:必須指定包含 FindBugs 的目錄,我是用 Ant 的一個(gè)屬性完成的,像這樣:可選屬性 output 指定 FindBugs 的結(jié)果使用的輸出格式??赡艿闹涤?xml 、 text 或者emacs 。如果沒(méi)有指定 outputFile ,那么 FindBugs 會(huì)使用標(biāo)準(zhǔn)輸出。如前所述, XML 格 式有可以在 UI 中觀看的額外好處。第3行:class元素用于指定要FindBugs分析哪些JAR、類文件或者目錄。分析多個(gè)JAR 或者類文件時(shí),要為每一個(gè)文件指定一個(gè)單獨(dú)的 class 元素。除非加入了 projectFile 元 素,否則需要 class 元素。第 4 行: 用嵌套元素 auxClasspath 列出應(yīng)用程序的依

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論