diff --git a/java/ql/test/query-tests/Nullness/B.java b/java/ql/test/query-tests/Nullness/B.java index b21d581535d..306fb540298 100644 --- a/java/ql/test/query-tests/Nullness/B.java +++ b/java/ql/test/query-tests/Nullness/B.java @@ -515,4 +515,46 @@ public class B { if (c == 100) { return; } o.hashCode(); // NPE } + + public void testFinally(int[] xs, int[] ys) { + if (xs.length == 0) return; + if (ys.length == 0) return; + String s1 = null; + String s2 = null; + for (int x : xs) { + try { + if (x == 0) { break; } + s1 = "1"; + for (int y : ys) { + if (y == 0) { break; } + s2 = "2"; + } + } finally { + } + s1.hashCode(); // OK + s2.hashCode(); // NPE + } + s1.hashCode(); // NPE - false negative, Java CFG lacks proper edge label + } + + public void lenCheck(int[] xs, int n, int t) { + if (n > 42) return; + if (maybe) {} + if (n > 0 && (xs == null || xs.length < n)) { + return; + } + if (maybe) {} + if (n > 21) return; + if (maybe) {} + for (int i = 0; i < n; ++i) { + xs[i]++; // Spurious NPE - false positive + } + } + + public void rangetest(int n) { + String s = null; + if (n < 0 || n > 10) s = "A"; + if (n > 100) s.hashCode(); // Spurious NPE - false positive + if (n == 42) s.hashCode(); // Spurious NPE - false positive + } } diff --git a/java/ql/test/query-tests/Nullness/NullMaybe.expected b/java/ql/test/query-tests/Nullness/NullMaybe.expected index f0d671d58bd..ff34f753b25 100644 --- a/java/ql/test/query-tests/Nullness/NullMaybe.expected +++ b/java/ql/test/query-tests/Nullness/NullMaybe.expected @@ -22,6 +22,10 @@ | B.java:465:9:465:9 | x | Variable $@ may be null at this access because of $@ assignment. | B.java:458:5:458:28 | Object x | x | B.java:470:9:470:16 | ...=... | this | | B.java:487:9:487:9 | x | Variable $@ may be null at this access because of $@ assignment. | B.java:476:5:476:20 | Object x | x | B.java:476:12:476:19 | x | this | | B.java:516:5:516:5 | o | Variable $@ may be null at this access as suggested by $@ null guard. | B.java:511:25:511:32 | o | o | B.java:512:22:512:30 | ... == ... | this | +| B.java:535:7:535:8 | s2 | Variable $@ may be null at this access because of $@ assignment. | B.java:523:5:523:21 | String s2 | s2 | B.java:523:12:523:20 | s2 | this | +| B.java:550:7:550:8 | xs | Variable $@ may be null at this access as suggested by $@ null guard. | B.java:540:24:540:31 | xs | xs | B.java:543:19:543:28 | ... == ... | this | +| B.java:557:18:557:18 | s | Variable $@ may be null at this access because of $@ assignment. | B.java:555:5:555:20 | String s | s | B.java:555:12:555:19 | s | this | +| B.java:558:18:558:18 | s | Variable $@ may be null at this access because of $@ assignment. | B.java:555:5:555:20 | String s | s | B.java:555:12:555:19 | s | this | | C.java:9:44:9:45 | a2 | Variable $@ may be null at this access as suggested by $@ null guard. | C.java:6:5:6:23 | long[][] a2 | a2 | C.java:7:34:7:54 | ... != ... | this | | C.java:9:44:9:45 | a2 | Variable $@ may be null at this access because of $@ assignment. | C.java:6:5:6:23 | long[][] a2 | a2 | C.java:6:14:6:22 | a2 | this | | C.java:10:17:10:18 | a3 | Variable $@ may be null at this access as suggested by $@ null guard. | C.java:8:5:8:21 | long[] a3 | a3 | C.java:9:38:9:58 | ... != ... | this |