Skip to content

Commit c66473c

Browse files
committed
Java: Add test for range analysis
1 parent d095d6b commit c66473c

File tree

3 files changed

+223
-0
lines changed

3 files changed

+223
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
public class A {
2+
int f1(int x, int y) {
3+
if (x < 500) {
4+
if (x > 400) {
5+
return x;
6+
}
7+
8+
if (y - 2 == x && y > 300) {
9+
return x + y;
10+
}
11+
12+
if (x != y + 1) {
13+
int sum = x + y; // x <= 400
14+
} else {
15+
if (y > 300) {
16+
int sum = x + y; // 302 <= x <= 400, y = x - 1, 301 <= y <= 399
17+
}
18+
}
19+
20+
if (x > 500) {
21+
return x;
22+
}
23+
}
24+
25+
return 0;
26+
}
27+
28+
int f2(int x, int y, int z) {
29+
if (x < 500) {
30+
if (x > 400) {
31+
return x;
32+
}
33+
34+
if (y == x - 1 && y > 300 && y + 2 == z && z == 350) {
35+
return x + y + z;
36+
}
37+
}
38+
39+
return 0;
40+
}
41+
}
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
| A.java:3:9:3:9 | x | SSA init(x) | 0 | lower | NoReason |
2+
| A.java:3:9:3:9 | x | SSA init(x) | 0 | upper | NoReason |
3+
| A.java:3:13:3:15 | 500 | 0 | 500 | lower | NoReason |
4+
| A.java:3:13:3:15 | 500 | 0 | 500 | upper | NoReason |
5+
| A.java:4:11:4:11 | x | 0 | 499 | upper | ... < ... |
6+
| A.java:4:11:4:11 | x | SSA init(x) | 0 | lower | NoReason |
7+
| A.java:4:11:4:11 | x | SSA init(x) | 0 | upper | NoReason |
8+
| A.java:4:15:4:17 | 400 | 0 | 400 | lower | NoReason |
9+
| A.java:4:15:4:17 | 400 | 0 | 400 | upper | NoReason |
10+
| A.java:5:16:5:16 | x | 0 | 401 | lower | ... > ... |
11+
| A.java:5:16:5:16 | x | 0 | 499 | upper | ... < ... |
12+
| A.java:5:16:5:16 | x | SSA init(x) | 0 | lower | NoReason |
13+
| A.java:5:16:5:16 | x | SSA init(x) | 0 | upper | NoReason |
14+
| A.java:8:11:8:11 | y | SSA init(y) | 0 | lower | NoReason |
15+
| A.java:8:11:8:11 | y | SSA init(y) | 0 | upper | NoReason |
16+
| A.java:8:11:8:15 | ... - ... | SSA init(y) | -2 | lower | NoReason |
17+
| A.java:8:11:8:15 | ... - ... | SSA init(y) | -2 | upper | NoReason |
18+
| A.java:8:15:8:15 | 2 | 0 | 2 | lower | NoReason |
19+
| A.java:8:15:8:15 | 2 | 0 | 2 | upper | NoReason |
20+
| A.java:8:20:8:20 | x | 0 | 400 | upper | ... > ... |
21+
| A.java:8:20:8:20 | x | SSA init(x) | 0 | lower | NoReason |
22+
| A.java:8:20:8:20 | x | SSA init(x) | 0 | upper | NoReason |
23+
| A.java:8:25:8:25 | y | 0 | 402 | upper | ... == ... |
24+
| A.java:8:25:8:25 | y | SSA init(x) | 2 | lower | ... == ... |
25+
| A.java:8:25:8:25 | y | SSA init(x) | 2 | upper | ... == ... |
26+
| A.java:8:25:8:25 | y | SSA init(y) | 0 | lower | NoReason |
27+
| A.java:8:25:8:25 | y | SSA init(y) | 0 | upper | NoReason |
28+
| A.java:8:29:8:31 | 300 | 0 | 300 | lower | NoReason |
29+
| A.java:8:29:8:31 | 300 | 0 | 300 | upper | NoReason |
30+
| A.java:9:16:9:16 | x | 0 | 400 | upper | ... > ... |
31+
| A.java:9:16:9:16 | x | SSA init(x) | 0 | lower | NoReason |
32+
| A.java:9:16:9:16 | x | SSA init(x) | 0 | upper | NoReason |
33+
| A.java:9:16:9:16 | x | SSA init(y) | -2 | lower | ... == ... |
34+
| A.java:9:16:9:16 | x | SSA init(y) | -2 | upper | ... == ... |
35+
| A.java:9:16:9:20 | ... + ... | SSA init(x) | 1 | lower | NoReason |
36+
| A.java:9:16:9:20 | ... + ... | SSA init(y) | -1 | lower | ... == ... |
37+
| A.java:9:20:9:20 | y | 0 | 301 | lower | ... > ... |
38+
| A.java:9:20:9:20 | y | 0 | 402 | upper | ... == ... |
39+
| A.java:9:20:9:20 | y | SSA init(x) | 2 | lower | ... == ... |
40+
| A.java:9:20:9:20 | y | SSA init(x) | 2 | upper | ... == ... |
41+
| A.java:9:20:9:20 | y | SSA init(y) | 0 | lower | NoReason |
42+
| A.java:9:20:9:20 | y | SSA init(y) | 0 | upper | NoReason |
43+
| A.java:12:11:12:11 | x | 0 | 400 | upper | ... > ... |
44+
| A.java:12:11:12:11 | x | SSA init(x) | 0 | lower | NoReason |
45+
| A.java:12:11:12:11 | x | SSA init(x) | 0 | upper | NoReason |
46+
| A.java:12:16:12:16 | y | SSA init(y) | 0 | lower | NoReason |
47+
| A.java:12:16:12:16 | y | SSA init(y) | 0 | upper | NoReason |
48+
| A.java:12:16:12:20 | ... + ... | SSA init(y) | 1 | lower | NoReason |
49+
| A.java:12:16:12:20 | ... + ... | SSA init(y) | 1 | upper | NoReason |
50+
| A.java:12:20:12:20 | 1 | 0 | 1 | lower | NoReason |
51+
| A.java:12:20:12:20 | 1 | 0 | 1 | upper | NoReason |
52+
| A.java:13:19:13:19 | x | 0 | 400 | upper | ... > ... |
53+
| A.java:13:19:13:19 | x | SSA init(x) | 0 | lower | NoReason |
54+
| A.java:13:19:13:19 | x | SSA init(x) | 0 | upper | NoReason |
55+
| A.java:13:23:13:23 | y | SSA init(y) | 0 | lower | NoReason |
56+
| A.java:13:23:13:23 | y | SSA init(y) | 0 | upper | NoReason |
57+
| A.java:15:13:15:13 | y | 0 | 399 | upper | ... != ... |
58+
| A.java:15:13:15:13 | y | SSA init(x) | -1 | lower | ... != ... |
59+
| A.java:15:13:15:13 | y | SSA init(x) | -1 | upper | ... != ... |
60+
| A.java:15:13:15:13 | y | SSA init(y) | 0 | lower | NoReason |
61+
| A.java:15:13:15:13 | y | SSA init(y) | 0 | upper | NoReason |
62+
| A.java:15:17:15:19 | 300 | 0 | 300 | lower | NoReason |
63+
| A.java:15:17:15:19 | 300 | 0 | 300 | upper | NoReason |
64+
| A.java:16:21:16:21 | x | 0 | 400 | upper | ... > ... |
65+
| A.java:16:21:16:21 | x | SSA init(x) | 0 | lower | NoReason |
66+
| A.java:16:21:16:21 | x | SSA init(x) | 0 | upper | NoReason |
67+
| A.java:16:21:16:21 | x | SSA init(y) | 1 | lower | ... != ... |
68+
| A.java:16:21:16:21 | x | SSA init(y) | 1 | upper | ... != ... |
69+
| A.java:16:21:16:25 | ... + ... | SSA init(x) | 1 | lower | NoReason |
70+
| A.java:16:21:16:25 | ... + ... | SSA init(y) | 2 | lower | ... != ... |
71+
| A.java:16:25:16:25 | y | 0 | 301 | lower | ... > ... |
72+
| A.java:16:25:16:25 | y | 0 | 399 | upper | ... != ... |
73+
| A.java:16:25:16:25 | y | SSA init(x) | -1 | lower | ... != ... |
74+
| A.java:16:25:16:25 | y | SSA init(x) | -1 | upper | ... != ... |
75+
| A.java:16:25:16:25 | y | SSA init(y) | 0 | lower | NoReason |
76+
| A.java:16:25:16:25 | y | SSA init(y) | 0 | upper | NoReason |
77+
| A.java:20:11:20:11 | x | 0 | 400 | upper | ... > ... |
78+
| A.java:20:11:20:11 | x | SSA init(x) | 0 | lower | NoReason |
79+
| A.java:20:11:20:11 | x | SSA init(x) | 0 | upper | NoReason |
80+
| A.java:20:15:20:17 | 500 | 0 | 500 | lower | NoReason |
81+
| A.java:20:15:20:17 | 500 | 0 | 500 | upper | NoReason |
82+
| A.java:21:16:21:16 | x | 0 | 400 | upper | ... > ... |
83+
| A.java:21:16:21:16 | x | 0 | 501 | lower | ... > ... |
84+
| A.java:21:16:21:16 | x | SSA init(x) | 0 | lower | NoReason |
85+
| A.java:21:16:21:16 | x | SSA init(x) | 0 | upper | NoReason |
86+
| A.java:25:12:25:12 | 0 | 0 | 0 | lower | NoReason |
87+
| A.java:25:12:25:12 | 0 | 0 | 0 | upper | NoReason |
88+
| A.java:29:9:29:9 | x | SSA init(x) | 0 | lower | NoReason |
89+
| A.java:29:9:29:9 | x | SSA init(x) | 0 | upper | NoReason |
90+
| A.java:29:13:29:15 | 500 | 0 | 500 | lower | NoReason |
91+
| A.java:29:13:29:15 | 500 | 0 | 500 | upper | NoReason |
92+
| A.java:30:11:30:11 | x | 0 | 499 | upper | ... < ... |
93+
| A.java:30:11:30:11 | x | SSA init(x) | 0 | lower | NoReason |
94+
| A.java:30:11:30:11 | x | SSA init(x) | 0 | upper | NoReason |
95+
| A.java:30:15:30:17 | 400 | 0 | 400 | lower | NoReason |
96+
| A.java:30:15:30:17 | 400 | 0 | 400 | upper | NoReason |
97+
| A.java:31:16:31:16 | x | 0 | 401 | lower | ... > ... |
98+
| A.java:31:16:31:16 | x | 0 | 499 | upper | ... < ... |
99+
| A.java:31:16:31:16 | x | SSA init(x) | 0 | lower | NoReason |
100+
| A.java:31:16:31:16 | x | SSA init(x) | 0 | upper | NoReason |
101+
| A.java:34:11:34:11 | y | SSA init(y) | 0 | lower | NoReason |
102+
| A.java:34:11:34:11 | y | SSA init(y) | 0 | upper | NoReason |
103+
| A.java:34:16:34:16 | x | 0 | 400 | upper | ... > ... |
104+
| A.java:34:16:34:16 | x | SSA init(x) | 0 | lower | NoReason |
105+
| A.java:34:16:34:16 | x | SSA init(x) | 0 | upper | NoReason |
106+
| A.java:34:16:34:20 | ... - ... | 0 | 399 | upper | ... > ... |
107+
| A.java:34:16:34:20 | ... - ... | SSA init(x) | -1 | lower | NoReason |
108+
| A.java:34:16:34:20 | ... - ... | SSA init(x) | -1 | upper | NoReason |
109+
| A.java:34:20:34:20 | 1 | 0 | 1 | lower | NoReason |
110+
| A.java:34:20:34:20 | 1 | 0 | 1 | upper | NoReason |
111+
| A.java:34:25:34:25 | y | 0 | 399 | upper | ... == ... |
112+
| A.java:34:25:34:25 | y | SSA init(x) | -1 | lower | ... == ... |
113+
| A.java:34:25:34:25 | y | SSA init(x) | -1 | upper | ... == ... |
114+
| A.java:34:25:34:25 | y | SSA init(y) | 0 | lower | NoReason |
115+
| A.java:34:25:34:25 | y | SSA init(y) | 0 | upper | NoReason |
116+
| A.java:34:29:34:31 | 300 | 0 | 300 | lower | NoReason |
117+
| A.java:34:29:34:31 | 300 | 0 | 300 | upper | NoReason |
118+
| A.java:34:36:34:36 | y | 0 | 301 | lower | ... > ... |
119+
| A.java:34:36:34:36 | y | 0 | 399 | upper | ... == ... |
120+
| A.java:34:36:34:36 | y | SSA init(x) | -1 | lower | ... == ... |
121+
| A.java:34:36:34:36 | y | SSA init(x) | -1 | upper | ... == ... |
122+
| A.java:34:36:34:36 | y | SSA init(y) | 0 | lower | NoReason |
123+
| A.java:34:36:34:36 | y | SSA init(y) | 0 | upper | NoReason |
124+
| A.java:34:36:34:40 | ... + ... | 0 | 303 | lower | ... > ... |
125+
| A.java:34:36:34:40 | ... + ... | 0 | 401 | upper | ... == ... |
126+
| A.java:34:36:34:40 | ... + ... | SSA init(x) | 1 | lower | ... == ... |
127+
| A.java:34:36:34:40 | ... + ... | SSA init(x) | 1 | upper | ... == ... |
128+
| A.java:34:36:34:40 | ... + ... | SSA init(y) | 2 | lower | NoReason |
129+
| A.java:34:36:34:40 | ... + ... | SSA init(y) | 2 | upper | NoReason |
130+
| A.java:34:40:34:40 | 2 | 0 | 2 | lower | NoReason |
131+
| A.java:34:40:34:40 | 2 | 0 | 2 | upper | NoReason |
132+
| A.java:34:45:34:45 | z | SSA init(z) | 0 | lower | NoReason |
133+
| A.java:34:45:34:45 | z | SSA init(z) | 0 | upper | NoReason |
134+
| A.java:34:50:34:50 | z | 0 | 303 | lower | ... == ... |
135+
| A.java:34:50:34:50 | z | 0 | 401 | upper | ... == ... |
136+
| A.java:34:50:34:50 | z | SSA init(x) | 1 | lower | ... == ... |
137+
| A.java:34:50:34:50 | z | SSA init(x) | 1 | upper | ... == ... |
138+
| A.java:34:50:34:50 | z | SSA init(y) | 2 | lower | ... == ... |
139+
| A.java:34:50:34:50 | z | SSA init(y) | 2 | upper | ... == ... |
140+
| A.java:34:50:34:50 | z | SSA init(z) | 0 | lower | NoReason |
141+
| A.java:34:50:34:50 | z | SSA init(z) | 0 | upper | NoReason |
142+
| A.java:34:55:34:57 | 350 | 0 | 350 | lower | NoReason |
143+
| A.java:34:55:34:57 | 350 | 0 | 350 | upper | NoReason |
144+
| A.java:35:16:35:16 | x | 0 | 400 | upper | ... > ... |
145+
| A.java:35:16:35:16 | x | SSA init(x) | 0 | lower | NoReason |
146+
| A.java:35:16:35:16 | x | SSA init(x) | 0 | upper | NoReason |
147+
| A.java:35:16:35:16 | x | SSA init(y) | 1 | lower | ... == ... |
148+
| A.java:35:16:35:16 | x | SSA init(y) | 1 | upper | ... == ... |
149+
| A.java:35:16:35:20 | ... + ... | SSA init(x) | 1 | lower | NoReason |
150+
| A.java:35:16:35:20 | ... + ... | SSA init(y) | 2 | lower | ... == ... |
151+
| A.java:35:16:35:24 | ... + ... | SSA init(x) | 2 | lower | NoReason |
152+
| A.java:35:16:35:24 | ... + ... | SSA init(y) | 3 | lower | ... == ... |
153+
| A.java:35:20:35:20 | y | 0 | 301 | lower | ... > ... |
154+
| A.java:35:20:35:20 | y | 0 | 399 | upper | ... == ... |
155+
| A.java:35:20:35:20 | y | SSA init(x) | -1 | lower | ... == ... |
156+
| A.java:35:20:35:20 | y | SSA init(x) | -1 | upper | ... == ... |
157+
| A.java:35:20:35:20 | y | SSA init(y) | 0 | lower | NoReason |
158+
| A.java:35:20:35:20 | y | SSA init(y) | 0 | upper | NoReason |
159+
| A.java:35:20:35:20 | y | SSA init(z) | -2 | lower | ... == ... |
160+
| A.java:35:20:35:20 | y | SSA init(z) | -2 | upper | ... == ... |
161+
| A.java:35:24:35:24 | z | 0 | 350 | lower | ... == ... |
162+
| A.java:35:24:35:24 | z | 0 | 350 | upper | ... == ... |
163+
| A.java:35:24:35:24 | z | SSA init(x) | 1 | lower | ... == ... |
164+
| A.java:35:24:35:24 | z | SSA init(x) | 1 | upper | ... == ... |
165+
| A.java:35:24:35:24 | z | SSA init(y) | 2 | lower | ... == ... |
166+
| A.java:35:24:35:24 | z | SSA init(y) | 2 | upper | ... == ... |
167+
| A.java:35:24:35:24 | z | SSA init(z) | 0 | lower | NoReason |
168+
| A.java:35:24:35:24 | z | SSA init(z) | 0 | upper | NoReason |
169+
| A.java:39:12:39:12 | 0 | 0 | 0 | lower | NoReason |
170+
| A.java:39:12:39:12 | 0 | 0 | 0 | upper | NoReason |
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import java
2+
import semmle.code.java.dataflow.RangeAnalysis
3+
4+
private string getDirectionString(boolean d) {
5+
result = "upper" and d = true
6+
or
7+
result = "lower" and d = false
8+
}
9+
10+
from Expr e, Bound b, int delta, boolean upper, Reason reason
11+
where bounded(e, b, delta, upper, reason)
12+
select e, b.toString(), delta, getDirectionString(upper), reason

0 commit comments

Comments
 (0)