• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 專注于軟件測試理論+實踐,自動化測試(功能、性能),希望廣交天下愛好測試的朋友,積極加入我的圈圈!測試者家園期待您的加入!

    Java代碼缺陷自動分析工具介紹

    上一篇 / 下一篇  2007-06-20 16:56:12

     

    Java代碼缺陷自動分析工具介紹

                                                                                                        MILY: 宋體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">黃錫波

    Java代碼缺陷自動分析工具主要有:Findbugs、PMDCheckStyle工具。這里重點介紹Findbugs的使用,簡要提及PMDCheckStyle工具的使用。

    1         FindBugs是什么?

    FindBugs 是一個java bytecode靜態分析工具,它可以幫助java工程師提高代碼質量以及排除隱含的缺陷。

    FindBugs檢查類或者 JAR 文件,將字節碼與一組缺陷模式進行對比以發現可能的問題。

    有了靜態分析工具,就可以在不實際運行程序的情況對軟件進行分析。FindBugs不是通過分析類文件的形式或結構來確定程序的意圖,而是通常使用 Visitor 模式進行分析(Visitor 模式的更多信息)。

     

    2         FindBugs可以做什么?

    FindBugs提供了35個檢測器來檢測字節碼中可能的缺陷?梢宰龅氖虑橹饕校

    2.1       找出 hash equals 不匹配

    找與 equals() hashCode() 的實現相關的幾個問題。這兩個方法非常重要,因為幾乎所有基于集合的類---List、Map、Set 等都調用它們。一般來說,這個檢測器尋找兩種不同類型的問題:

    ①當一個類重寫對象的 equals() 方法,但是沒有重寫它的 hashCode 方法,或者相反的情況時。

    ②定義一個 co-variant 版本的 equals() compareTo() 方法。例如, Bob 類定義其 equals() 方法為布爾 equals(Bob) ,它覆蓋了對象中定義的 equals() 方法。因為 Java 代碼在編譯時解析重載方法的方式,在運行時使用的幾乎總是在對象中定義的這個版本的方法,而不是在 Bob 中定義的那一個(除非顯式將 equals() 方法的參數強制轉換為 Bob 類型)。因此,當這個類的一個實例放入到類集合中的任何一個中時,使用的是 Object.equals() 版本的方法,而不是在 Bob 中定義的版本。在這種情況下, Bob 類應當定義一個接受類型為 Object 的參數的 equals() 方法。

     

    2.2       檢測:忽略方法返回值

    這個檢測器查找代碼中忽略了不應該忽略的方法返回值的地方。這種情況的一個常見例子是在調用 String 方法時,例如:

    1 String aString = "bob";

    2 b.replace('b', 'p');

    3 if(b.equals("pop"))

    這個錯誤很常見。在第 2 行,程序員認為他已經用 p 替換了字符串中的所有 b。確實是這樣,但是他忘記了字符串是不可變的。所有這類方法都返回一個新字符串,而從來不會改變消息的接收者。

     

    2.3       檢測:Null 指針對 null 的解引用(dereference)和冗余比較

    這個檢測器查找兩類問題。它查找代碼路徑將會或者可能造成 null 指針異常的情況,它還查找對 null 的冗余比較的情況。例如,如果兩個比較值都為 null,那么它們就是冗余的并可能表明代碼錯誤。FindBugs 在可以確定一個值為 null 而另一個值不為 null 時,檢測類似的錯誤,例如:

    1 Person person = aMap.get("bob");

    2 if (person != null) {

    3      person.updateAccessTime();

    4 }

    5 String name = person.getName();

    在這個例子中,如果第 1 行的 Map 不包括一個名為“bob”的人,那么在第 5 行詢問 person 的名字時就會出現 null 指針異常。因為 FindBugs 不知道 map 是否包含“bob”,所以它將第 5 行標記為可能 null 指針異常。

     

    2.4       檢測:初始化之前讀取字段

    這個檢測器尋找在構造函數中初始化之前被讀取的字段。這個錯誤通常是由使用字段名而不是構造函數參數引起的,例如在構造函數中讀取未初始化的字段:

    1 public class Thing {

    2      private List actions;

    3      public Thing(String startingActions) {

    4       StringTokenizer tokenizer = new StringTokenizer(startingActions);

    5          while (tokenizer.hasMoreTokens()) {

    6              actions.add(tokenizer.nextToken());

    7       }

    8      }

    9 }

    在這個例子中,第 6 行將產生一個 null 指針異常,因為變量 actions 還沒有初始化。

     

    2.5       命名檢查

    對標準 Java 命令規范的測試:變量名稱不應太短;方法名稱不應過長;類名稱應當以小寫字母開頭;方法和字段名應當以小寫字母開頭,等等。

     

    2.6       未使用的代碼檢查

    查找從未使用的私有字段和本地變量、執行不到的語句、從未調用的私有方法,等等。

     

    2.7       嵌套檢查

    例如: switch 語句應當有 default 塊,應當避免深度嵌套的 if 塊,不應當給參數重新賦值,不應該對 double 值進行相等比較。

     

    2.8       導入語句檢查

    檢查 import 語句的問題,比如同一個類被導入兩次或者被導入 java.lang 的類中。

     

    2.9       JUnit 測試檢查

    查找測試用例測試方法的特定問題,例如方法名稱的正確拼寫,以及 suite() 方法是不是 static public。

     

    2.10   字符串檢查

    找出處理字符串時遇到的常見問題,例如重復的字符串標量,調用 String 構造函數,對 String 變量調用 toString() 方法。

     

    2.11   括號檢查

    檢查 for、 if、 while else 語句是否使用了括號。

     

    2.12   代碼尺寸檢查

    測試過長的方法、有太多方法的類以及重構方面的類似問題。

     

    2.13   終結函數檢查

    因為在 Java 語言中, finalize() 方法不是那么普遍,它們的使用規則雖然很詳細,但是人們對它們相對不是很熟悉。這類檢查查找 finalize() 方法的各種問題,例如空的終結函數,調用其他方法的 finalize() 方法,對 finalize() 的顯式調用,等等。

     

    2.14   克隆檢查

    用于 clone() 方法的新規則。凡是重寫 clone() 方法的類都必須實現 Cloneable, clone() 方法應該調用 super.clone(),而 clone() 方法應該聲明拋出 CloneNotSupportedException 異常,即使實際上沒有拋出異常,也要如此。

     

    2.15   耦合檢查

    查找類之間過度耦合的跡象,比如導入內容太多;在超類型或接口就已經夠用的時候使用子類的類型;類中的字段、變量和返回類型過多等。

     

    2.16   異常檢查

    針對異常的檢查:不應該聲明該方法而拋出 java.lang.Exception 異常,不應當將異常用于流控制,不應該捕獲 Throwable,等等。

     

    2.17   日志檢查

    查找 java.util.logging.Logger 的不當使用,包括非終狀態(nonfinal)、非靜態的記錄器,以及在一個類中有多個記錄器。

     

    2.18   Open

    Link URL: http://www.cnblogs.com/tester2test/archive/2006/06/08/420832.html

    TAG:

     

    評分:0

    我來說兩句

    顯示全部

    :loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

    日歷

    « 2011-03-26  
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  

    數據統計

    • 訪問量: 8895
    • 日志數: 150
    • 建立時間: 2007-04-23
    • 更新時間: 2007-06-21

    RSS訂閱

    Open Toolbar
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>