Add assertNull as the source
While assertNotNull can work as a null check for NPE.RET, assertNull can be treated as a null source, since the method will continue its execution only if the parameter of the call is null. See below:
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(); } }
In the sample above, assertNull guarantees that field is null, however there is an attempt to dereference this null value at
sb.append(field.hashCode());
In order to detect this situation we have to add @Source to the knowledge base and bind it to the checker:
package junit.framework; @Bind("NPE.RET") class Assert { public static void assertNull(@Source Object object); }
To test your knowledge base:
- Import the knowledge base into your project using kwcheck:
kwcheck import sink.jkb
- Run the analysis:
kwcheck run
When you run kwcheck you will see that NPE.RET is detected.