Files
codeql/java/ql/test/query-tests/Nullness/C.java
2025-11-12 14:14:32 +01:00

269 lines
5.6 KiB
Java

import java.util.*;
public class C {
public void ex1(long[][][] a1, int ix, int len) {
long[][] a2 = null;
boolean haveA2 = ix < len && (a2 = a1[ix]) != null;
long[] a3 = null;
final boolean haveA3 = haveA2 && (a3 = a2[ix]) != null; // NPE - false positive
if (haveA3) a3[0] = 0; // NPE - false positive
}
public void ex2(boolean x, boolean y) {
String s1 = x ? null : "";
String s2 = (s1 == null) ? null : "";
if (s2 == null) {
s1 = y ? null : "";
s2 = (s1 == null) ? null : "";
}
if (s2 != null)
s1.hashCode(); // NPE - false positive
}
public void ex3(List<String> ss) {
String last = null;
for (String s : new String[] { "aa", "bb" }) {
last = s;
}
last.hashCode(); // OK
last = null;
if (!ss.isEmpty()) {
for (String s : ss) {
last = s;
}
last.hashCode(); // OK
}
}
public void ex4(Iterable<String> list, int step) {
int index = 0;
List<List<String>> result = new ArrayList<>();
List<String> slice = null;
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
String str = iter.next();
if (index % step == 0) {
slice = new ArrayList<>();
result.add(slice);
}
slice.add(str); // NPE - false positive
++index;
iter.remove();
}
}
public void ex5(boolean hasArr, int[] arr) {
int arrLen = 0;
if (hasArr) {
arrLen = arr == null ? 0 : arr.length;
}
if (arrLen > 0) {
arr[0] = 0; // OK
}
}
public final int MY_CONST_A = 1;
public final int MY_CONST_B = 2;
public final int MY_CONST_C = 3;
public void ex6(int[] vals, boolean b1, boolean b2) {
final int switchguard;
if (vals != null && b1) {
switchguard = MY_CONST_A;
} else if (vals != null && b2) {
switchguard = MY_CONST_B;
} else {
switchguard = MY_CONST_C;
}
switch (switchguard) {
case MY_CONST_A:
vals[0] = 0; // OK
break;
case MY_CONST_C:
break;
case MY_CONST_B:
vals[0] = 0; // OK
break;
default:
throw new RuntimeException();
}
}
public void ex7(int[] arr1) {
int[] arr2 = null;
if (arr1.length > 0) {
arr2 = new int[arr1.length];
}
for (int i = 0; i < arr1.length; i++)
arr2[i] = arr1[i]; // OK
}
public void ex8(int x, int lim) {
boolean stop = x < 1;
int i = 0;
Object obj = new Object();
while (!stop) {
int j = 0;
while (!stop && j < lim) {
int step = (j * obj.hashCode()) % 10; // OK
if (step == 0) {
obj.hashCode();
i += 1;
stop = i >= x;
if (!stop) {
obj = new Object();
} else {
obj = null;
}
continue;
}
j += step;
}
}
}
public void ex9(boolean cond, Object obj1) {
if (cond) {
return;
}
Object obj2 = obj1;
if (obj2 != null && obj2.hashCode() % 5 > 2) {
obj2.hashCode();
cond = true;
}
if (cond) {
obj2.hashCode(); // OK
}
}
public void ex10(int[] a) {
int n = a == null ? 0 : a.length;
for (int i = 0; i < n; i++) {
int x = a[i]; // NPE - false positive
if (x > 7)
a = new int[n];
}
}
public void ex11(Object obj, Boolean b1) {
Boolean b2 = obj == null ? Boolean.FALSE : b1;
if (b2 == null) {
obj.hashCode(); // OK
}
if (obj == null) {
b1 = Boolean.TRUE;
}
if (b1 == null) {
obj.hashCode(); // OK
}
}
private final Object finalObj = new Object();
public void ex12() {
finalObj.hashCode(); // OK
if (finalObj != null) {
finalObj.hashCode(); // OK
}
}
private void verifyBool(boolean b) {
if (!b) {
throw new Error();
}
}
public void ex13(int[] a) {
int i = 0;
boolean b = false;
Object obj = null;
while (a[++i] != 0) {
if (a[i] == 1) {
obj = new Object();
b = true;
} else if (a[i] == 2) {
verifyBool(b);
obj.hashCode(); // OK
}
}
}
private void verifyNotNull(Object obj) {
if (obj == null) {
throw new Error();
}
}
public void ex14(int[] a) {
int i = 0;
Object obj = null;
while (a[++i] != 0) {
if (a[i] == 1) {
obj = new Object();
} else if (a[i] == 2) {
verifyNotNull(obj);
obj.hashCode(); // OK
}
}
}
public void ex15(Object o1, Object o2) {
if (o1 == null && o2 != null) {
return;
}
if (o1 == o2) {
return;
}
if (o1.equals(o2)) { // NPE - false positive
return;
}
}
private Object foo16;
private Object getFoo16() {
return this.foo16;
}
public static void ex16(C c) {
int[] xs = c.getFoo16() != null ? new int[5] : null;
if (c.getFoo16() != null) {
xs[0]++; // NPE - false positive
}
}
public static final int MAXLEN = 1024;
public void ex17() {
int[] xs = null;
// loop executes at least once
for (int i = 32; i <= MAXLEN; i *= 2) {
xs = new int[5];
}
xs[0]++; // OK
}
public void ex18(boolean b, int[] xs, Object related) {
assert (!b && xs == null && related == null) ||
(b && xs != null && related != null) ||
(b && xs == null && related == null);
if (b) {
if (related == null) { return; }
xs[0] = 42; // OK
}
}
public void ex19(Object t, Object x) {
boolean b = t != null || x != null;
if (b) {
if (t != null) {
t.hashCode(); // OK
} else {
x.hashCode(); // OK
}
}
}
}