EN JP CN

Java チューニングチュートリアル 3 - 誤検知を低減するための NPE.RET のチューニング

Java チューニングチュートリアル 3 - 誤検知を低減するための NPE.RET のチューニング

Java チューニングチュートリアル 3 - 誤検知を低減するための NPE.RET のチューニング

Java チューニングチュートリアル 3 - 誤検知を低減するための NPE.RET のチューニング

次の抜粋があるとします。

package com.klocwork.jdefects.checkers.dfa.binding_walkthrough;


public class CheckSample1 {
   public String toString() {   
      final Object o = get();   
      return o.toString();  
   }
 
   private Object get() {   
      if (hashCode() > 0 ) {      
         return new Object();  
      }    
      return null;  
   }
}

kwcheck の解析では NPE.RET 指摘が検出されます。フィールドは get()and から null が返され、o.toString() で逆参照されています。

エラー修正のためのアサートの追加

NPE.RET 指摘を修正するには、コードに assertNotNull(o); を追加します。

package com.klocwork.jdefects.checkers.dfa.binding_walkthrough;


public class CheckSample1 {  
   public String toString() {   
      final Object o = get();
      assertNotNull(o);
      return o.toString(); 
   }
 
   private Object get() {    
      if (hashCode() > 0 ) {    
         return new Object();    
      }  
      return null;  
   }
}

.jkb ファイルの作成とチェックとしてのメソッドの記述

アサートを追加して解析を再実行しても、assertNotNull の呼び出しはライブラリメソッドの呼び出しで、Klocwork には特定の情報がないため、引き続き NPE.RET が報告されます。

  1. check.jkb のように、ファイル拡張子が .jkb のテキストファイルを作成します。
  2. ファイルにメソッドをチェックとして記述します。
package junit.framework;


class Assert { 
   public static void assertNotNull(@Check Object object);
}
注: Eclipse ユーザーおよび IntelliJ IDEA ユーザーもこの手順を使用できます。

Check レコードのチェッカーへのバインド

@Check を追加した後、@Bind("NPE.RET") を使用してデータを指摘にバインドします。

package junit.framework;


@Bind("NPE.RET")
class Assert { 
   public static void assertNotNull(@Check Object object);<br>
}

knowledge base (ナレッジベース) のテスト

knowledge base (ナレッジベース) をテストするには:

  1. kwcheck を使用して knowledge base (ナレッジベース) をプロジェクトにインポートします。
    kwcheck import check.jkb
    
  2. 解析を実行します。
    kwcheck run
    

この knowledge base (ナレッジベース) を使用してコードを解析すると、Klocwork で assertNotNull がチェックであることを把握するようになるため、NPE.RET が報告されません。