ソースとしての assertNull の追加

assertNotNull は NPE.RET の null チェックとして使用できますが、呼び出しのパラメーターが null の場合にのみメソッドが実行を継続するため、assertNull を null ソースとして処理することができます。以下を参照してください。

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

import static junit.framework.Assert.assertNull;

public class SourceSample {
  

   private Object field;
   
   public void setField(Object field) {      
      this.field = field;
   }
   
   public String toString() {     
      StringBuilder sb = new StringBuilder();     
      assertNull(field);      
      sb.append('[');      
      sb.append(field.hashCode());      
      sb.append(']');     
      return sb.toString();   
   }
}

上の例で、assertNull によりフィールドが null であることが保証されますが、次の行でこの null 値の逆参照が試行されます。

sb.append(field.hashCode());

この状況を検出するためには、knowledge base (ナレッジベース) に @Source を追加してチェッカーにバインドする必要があります。

package junit.framework;


@Bind("NPE.RET")
class Assert {   
   public static void assertNull(@Source Object object);
}

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

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

kwcheck を実行すると、NPE.RET が検出されることがわかります。