1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
import org.checkerframework.checker.nullness.qual.*;
import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
public class ConditionalNullness {
@EnsuresNonNullIf(
expression = {"field", "method()"},
result = true)
boolean checkNonNull() {
// don't bother with the implementation
// :: error: (contracts.conditional.postcondition.not.satisfied)
return true;
}
@Nullable Object field = null;
@org.checkerframework.dataflow.qual.Pure
@Nullable Object method() {
return "m";
}
void testSelfWithCheck() {
ConditionalNullness other = new ConditionalNullness();
if (checkNonNull()) {
field.toString();
method().toString();
// :: error: (dereference.of.nullable)
other.field.toString(); // error
// :: error: (dereference.of.nullable)
other.method().toString(); // error
}
// :: error: (dereference.of.nullable)
method().toString(); // error
}
void testSelfWithoutCheck() {
// :: error: (dereference.of.nullable)
field.toString(); // error
// :: error: (dereference.of.nullable)
method().toString(); // error
}
void testSelfWithCheckNegation() {
if (checkNonNull()) {
// nothing to do
} else {
// :: error: (dereference.of.nullable)
field.toString(); // error
}
field.toString(); // error
}
void testOtherWithCheck() {
ConditionalNullness other = new ConditionalNullness();
if (other.checkNonNull()) {
other.field.toString();
other.method().toString();
// :: error: (dereference.of.nullable)
field.toString(); // error
// :: error: (dereference.of.nullable)
method().toString(); // error
}
// :: error: (dereference.of.nullable)
other.method().toString(); // error
// :: error: (dereference.of.nullable)
method().toString(); // error
}
void testOtherWithoutCheck() {
ConditionalNullness other = new ConditionalNullness();
// :: error: (dereference.of.nullable)
other.field.toString(); // error
// :: error: (dereference.of.nullable)
other.method().toString(); // error
// :: error: (dereference.of.nullable)
field.toString(); // error
// :: error: (dereference.of.nullable)
method().toString(); // error
}
void testOtherWithCheckNegation() {
ConditionalNullness other = new ConditionalNullness();
if (other.checkNonNull()) {
// nothing to do
} else {
// :: error: (dereference.of.nullable)
other.field.toString(); // error
// :: error: (dereference.of.nullable)
other.method().toString(); // error
// :: error: (dereference.of.nullable)
field.toString(); // error
}
// :: error: (dereference.of.nullable)
field.toString(); // error
}
}
|