ソースとしての 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 (ナレッジベース) をテストするには:
- kwcheck を使用して knowledge base (ナレッジベース) をプロジェクトにインポートします。
kwcheck import sink.jkb
- 解析を実行します。
kwcheck run
kwcheck を実行すると、NPE.RET が検出されることがわかります。