1 // RUN: %clang_analyze_cc1 \
2 // RUN: -analyzer-checker=debug.ExprInspection,core.builtin \
3 // RUN: -analyzer-config aggressive-binary-operation-simplification=true \
4 // RUN: -analyzer-config support-symbolic-integer-casts=false \
5 // RUN: -analyzer-config eagerly-assume=false \
6 // RUN: -verify %s
7
8 // RUN: %clang_analyze_cc1 \
9 // RUN: -analyzer-checker=debug.ExprInspection,core.builtin \
10 // RUN: -analyzer-config aggressive-binary-operation-simplification=true \
11 // RUN: -analyzer-config support-symbolic-integer-casts=true \
12 // RUN: -DSUPPORT_SYMBOLIC_INTEGER_CASTS \
13 // RUN: -analyzer-config eagerly-assume=false \
14 // RUN: -verify %s
15
16 void clang_analyzer_eval(bool x);
17 template <typename T>
18 void clang_analyzer_denote(T x, const char *literal);
19 template <typename T>
20 void clang_analyzer_express(T x);
21
22 void exit(int);
23
24 #define UINT_MAX (~0U)
25 #define INT_MAX (UINT_MAX & (UINT_MAX >> 1))
26
27 extern void __assert_fail (__const char *__assertion, __const char *__file,
28 unsigned int __line, __const char *__function)
29 __attribute__ ((__noreturn__));
30 #define assert(expr) \
31 ((expr) ? (void)(0) : __assert_fail (#expr, __FILE__, __LINE__, __func__))
32
33 int g(void);
f(void)34 int f(void) {
35 int x = g();
36 // Assert that no overflows occur in this test file.
37 // Assuming that concrete integers are also within that range.
38 assert(x <= ((int)INT_MAX / 4));
39 assert(x >= -((int)INT_MAX / 4));
40 return x;
41 }
42
compare_different_symbol_equal(void)43 void compare_different_symbol_equal(void) {
44 int x = f(), y = f();
45 clang_analyzer_denote(x, "$x");
46 clang_analyzer_denote(y, "$y");
47 clang_analyzer_express(x == y); // expected-warning {{$x - $y == 0}}
48 }
49
compare_different_symbol_plus_left_int_equal(void)50 void compare_different_symbol_plus_left_int_equal(void) {
51 int x = f(), y = f();
52 clang_analyzer_denote(x, "$x");
53 clang_analyzer_denote(y, "$y");
54 x += 1;
55 clang_analyzer_express(x == y); // expected-warning {{$y - $x == 1}}
56 }
57
compare_different_symbol_minus_left_int_equal(void)58 void compare_different_symbol_minus_left_int_equal(void) {
59 int x = f(), y = f();
60 clang_analyzer_denote(x, "$x");
61 clang_analyzer_denote(y, "$y");
62 x -= 1;
63 clang_analyzer_express(x == y); // expected-warning {{$x - $y == 1}}
64 }
65
compare_different_symbol_plus_right_int_equal(void)66 void compare_different_symbol_plus_right_int_equal(void) {
67 int x = f(), y = f();
68 clang_analyzer_denote(x, "$x");
69 clang_analyzer_denote(y, "$y");
70 y += 2;
71 clang_analyzer_express(y); // expected-warning {{$y + 2}}
72 clang_analyzer_express(x == y); // expected-warning {{$x - $y == 2}}
73 }
74
compare_different_symbol_minus_right_int_equal(void)75 void compare_different_symbol_minus_right_int_equal(void) {
76 int x = f(), y = f();
77 clang_analyzer_denote(x, "$x");
78 clang_analyzer_denote(y, "$y");
79 y -= 2;
80 clang_analyzer_express(y); // expected-warning {{$y - 2}}
81 clang_analyzer_express(x == y); // expected-warning {{$y - $x == 2}}
82 }
83
compare_different_symbol_plus_left_plus_right_int_equal(void)84 void compare_different_symbol_plus_left_plus_right_int_equal(void) {
85 int x = f(), y = f();
86 clang_analyzer_denote(x, "$x");
87 clang_analyzer_denote(y, "$y");
88 x += 2;
89 y += 1;
90 clang_analyzer_express(x); // expected-warning {{$x + 2}}
91 clang_analyzer_express(y); // expected-warning {{$y + 1}}
92 clang_analyzer_express(x == y); // expected-warning {{$y - $x == 1}}
93 }
94
compare_different_symbol_plus_left_minus_right_int_equal(void)95 void compare_different_symbol_plus_left_minus_right_int_equal(void) {
96 int x = f(), y = f();
97 clang_analyzer_denote(x, "$x");
98 clang_analyzer_denote(y, "$y");
99 x += 2;
100 y -= 1;
101 clang_analyzer_express(x); // expected-warning {{$x + 2}}
102 clang_analyzer_express(y); // expected-warning {{$y - 1}}
103 clang_analyzer_express(x == y); // expected-warning {{$y - $x == 3}}
104 }
105
compare_different_symbol_minus_left_plus_right_int_equal(void)106 void compare_different_symbol_minus_left_plus_right_int_equal(void) {
107 int x = f(), y = f();
108 clang_analyzer_denote(x, "$x");
109 clang_analyzer_denote(y, "$y");
110 x -= 2;
111 y += 1;
112 clang_analyzer_express(x); // expected-warning {{$x - 2}}
113 clang_analyzer_express(y); // expected-warning {{$y + 1}}
114 clang_analyzer_express(x == y); // expected-warning {{$x - $y == 3}}
115 }
116
compare_different_symbol_minus_left_minus_right_int_equal(void)117 void compare_different_symbol_minus_left_minus_right_int_equal(void) {
118 int x = f(), y = f();
119 clang_analyzer_denote(x, "$x");
120 clang_analyzer_denote(y, "$y");
121 x -= 2;
122 y -= 1;
123 clang_analyzer_express(x); // expected-warning {{$x - 2}}
124 clang_analyzer_express(y); // expected-warning {{$y - 1}}
125 clang_analyzer_express(x == y); // expected-warning {{$x - $y == 1}}
126 }
127
compare_same_symbol_equal(void)128 void compare_same_symbol_equal(void) {
129 int x = f(), y = x;
130 clang_analyzer_denote(x, "$x");
131 clang_analyzer_express(y); // expected-warning {{$x}}
132 clang_analyzer_eval(x == y); // expected-warning {{TRUE}}
133 }
134
compare_same_symbol_plus_left_int_equal(void)135 void compare_same_symbol_plus_left_int_equal(void) {
136 int x = f(), y = x;
137 clang_analyzer_denote(x, "$x");
138 ++x;
139 clang_analyzer_express(x); // expected-warning {{$x + 1}}
140 clang_analyzer_express(y); // expected-warning {{$x}}
141 clang_analyzer_eval(x == y); // expected-warning {{FALSE}}
142 }
143
compare_same_symbol_minus_left_int_equal(void)144 void compare_same_symbol_minus_left_int_equal(void) {
145 int x = f(), y = x;
146 clang_analyzer_denote(x, "$x");
147 --x;
148 clang_analyzer_express(x); // expected-warning {{$x - 1}}
149 clang_analyzer_express(y); // expected-warning {{$x}}
150 clang_analyzer_eval(x == y); // expected-warning {{FALSE}}
151 }
152
compare_same_symbol_plus_right_int_equal(void)153 void compare_same_symbol_plus_right_int_equal(void) {
154 int x = f(), y = x + 1;
155 clang_analyzer_denote(x, "$x");
156 clang_analyzer_express(y); // expected-warning {{$x + 1}}
157 clang_analyzer_eval(x == y); // expected-warning {{FALSE}}
158 }
159
compare_same_symbol_minus_right_int_equal(void)160 void compare_same_symbol_minus_right_int_equal(void) {
161 int x = f(), y = x - 1;
162 clang_analyzer_denote(x, "$x");
163 clang_analyzer_express(y); // expected-warning {{$x - 1}}
164 clang_analyzer_eval(x == y); // expected-warning {{FALSE}}
165 }
166
compare_same_symbol_plus_left_plus_right_int_equal(void)167 void compare_same_symbol_plus_left_plus_right_int_equal(void) {
168 int x = f(), y = x + 1;
169 clang_analyzer_denote(x, "$x");
170 ++x;
171 clang_analyzer_express(x); // expected-warning {{$x + 1}}
172 clang_analyzer_express(y); // expected-warning {{$x + 1}}
173 clang_analyzer_eval(x == y); // expected-warning {{TRUE}}
174 }
175
compare_same_symbol_plus_left_minus_right_int_equal(void)176 void compare_same_symbol_plus_left_minus_right_int_equal(void) {
177 int x = f(), y = x - 1;
178 clang_analyzer_denote(x, "$x");
179 ++x;
180 clang_analyzer_express(x); // expected-warning {{$x + 1}}
181 clang_analyzer_express(y); // expected-warning {{$x - 1}}
182 clang_analyzer_eval(x == y); // expected-warning {{FALSE}}
183 }
184
compare_same_symbol_minus_left_plus_right_int_equal(void)185 void compare_same_symbol_minus_left_plus_right_int_equal(void) {
186 int x = f(), y = x + 1;
187 clang_analyzer_denote(x, "$x");
188 --x;
189 clang_analyzer_express(x); // expected-warning {{$x - 1}}
190 clang_analyzer_express(y); // expected-warning {{$x + 1}}
191 clang_analyzer_eval(x == y); // expected-warning {{FALSE}}
192 }
193
compare_same_symbol_minus_left_minus_right_int_equal(void)194 void compare_same_symbol_minus_left_minus_right_int_equal(void) {
195 int x = f(), y = x - 1;
196 clang_analyzer_denote(x, "$x");
197 --x;
198 clang_analyzer_express(x); // expected-warning {{$x - 1}}
199 clang_analyzer_express(y); // expected-warning {{$x - 1}}
200 clang_analyzer_eval(x == y); // expected-warning {{TRUE}}
201 }
202
compare_different_symbol_less_or_equal(void)203 void compare_different_symbol_less_or_equal(void) {
204 int x = f(), y = f();
205 clang_analyzer_denote(x, "$x");
206 clang_analyzer_denote(y, "$y");
207 clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 0}}
208 }
209
compare_different_symbol_plus_left_int_less_or_equal(void)210 void compare_different_symbol_plus_left_int_less_or_equal(void) {
211 int x = f(), y = f();
212 clang_analyzer_denote(x, "$x");
213 clang_analyzer_denote(y, "$y");
214 x += 1;
215 clang_analyzer_express(x); // expected-warning {{$x + 1}}
216 clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 1}}
217 }
218
compare_different_symbol_minus_left_int_less_or_equal(void)219 void compare_different_symbol_minus_left_int_less_or_equal(void) {
220 int x = f(), y = f();
221 clang_analyzer_denote(x, "$x");
222 clang_analyzer_denote(y, "$y");
223 x -= 1;
224 clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 1}}
225 }
226
compare_different_symbol_plus_right_int_less_or_equal(void)227 void compare_different_symbol_plus_right_int_less_or_equal(void) {
228 int x = f(), y = f();
229 clang_analyzer_denote(x, "$x");
230 clang_analyzer_denote(y, "$y");
231 y += 2;
232 clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 2}}
233 }
234
compare_different_symbol_minus_right_int_less_or_equal(void)235 void compare_different_symbol_minus_right_int_less_or_equal(void) {
236 int x = f(), y = f();
237 clang_analyzer_denote(x, "$x");
238 clang_analyzer_denote(y, "$y");
239 y -= 2;
240 clang_analyzer_express(y); // expected-warning {{$y - 2}}
241 clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 2}}
242 }
243
compare_different_symbol_plus_left_plus_right_int_less_or_equal(void)244 void compare_different_symbol_plus_left_plus_right_int_less_or_equal(void) {
245 int x = f(), y = f();
246 clang_analyzer_denote(x, "$x");
247 clang_analyzer_denote(y, "$y");
248 x += 2;
249 y += 1;
250 clang_analyzer_express(x); // expected-warning {{$x + 2}}
251 clang_analyzer_express(y); // expected-warning {{$y + 1}}
252 clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 1}}
253 }
254
compare_different_symbol_plus_left_minus_right_int_less_or_equal(void)255 void compare_different_symbol_plus_left_minus_right_int_less_or_equal(void) {
256 int x = f(), y = f();
257 clang_analyzer_denote(x, "$x");
258 clang_analyzer_denote(y, "$y");
259 x += 2;
260 y -= 1;
261 clang_analyzer_express(x); // expected-warning {{$x + 2}}
262 clang_analyzer_express(y); // expected-warning {{$y - 1}}
263 clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 3}}
264 }
265
compare_different_symbol_minus_left_plus_right_int_less_or_equal(void)266 void compare_different_symbol_minus_left_plus_right_int_less_or_equal(void) {
267 int x = f(), y = f();
268 clang_analyzer_denote(x, "$x");
269 clang_analyzer_denote(y, "$y");
270 x -= 2;
271 y += 1;
272 clang_analyzer_express(x); // expected-warning {{$x - 2}}
273 clang_analyzer_express(y); // expected-warning {{$y + 1}}
274 clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 3}}
275 }
276
compare_different_symbol_minus_left_minus_right_int_less_or_equal(void)277 void compare_different_symbol_minus_left_minus_right_int_less_or_equal(void) {
278 int x = f(), y = f();
279 clang_analyzer_denote(x, "$x");
280 clang_analyzer_denote(y, "$y");
281 x -= 2;
282 y -= 1;
283 clang_analyzer_express(x); // expected-warning {{$x - 2}}
284 clang_analyzer_express(y); // expected-warning {{$y - 1}}
285 clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 1}}
286 }
287
compare_same_symbol_less_or_equal(void)288 void compare_same_symbol_less_or_equal(void) {
289 int x = f(), y = x;
290 clang_analyzer_denote(x, "$x");
291 clang_analyzer_express(y); // expected-warning {{$x}}
292 clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
293 }
294
compare_same_symbol_plus_left_int_less_or_equal(void)295 void compare_same_symbol_plus_left_int_less_or_equal(void) {
296 int x = f(), y = x;
297 clang_analyzer_denote(x, "$x");
298 ++x;
299 clang_analyzer_express(x); // expected-warning {{$x + 1}}
300 clang_analyzer_express(y); // expected-warning {{$x}}
301 clang_analyzer_eval(x <= y); // expected-warning {{FALSE}}
302 }
303
compare_same_symbol_minus_left_int_less_or_equal(void)304 void compare_same_symbol_minus_left_int_less_or_equal(void) {
305 int x = f(), y = x;
306 clang_analyzer_denote(x, "$x");
307 --x;
308 clang_analyzer_express(x); // expected-warning {{$x - 1}}
309 clang_analyzer_express(y); // expected-warning {{$x}}
310 clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
311 }
312
compare_same_symbol_plus_right_int_less_or_equal(void)313 void compare_same_symbol_plus_right_int_less_or_equal(void) {
314 int x = f(), y = x + 1;
315 clang_analyzer_denote(x, "$x");
316 clang_analyzer_express(y); // expected-warning {{$x + 1}}
317 clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
318 }
319
compare_same_symbol_minus_right_int_less_or_equal(void)320 void compare_same_symbol_minus_right_int_less_or_equal(void) {
321 int x = f(), y = x - 1;
322 clang_analyzer_denote(x, "$x");
323 clang_analyzer_express(y); // expected-warning {{$x - 1}}
324 clang_analyzer_eval(x <= y); // expected-warning {{FALSE}}
325 }
326
compare_same_symbol_plus_left_plus_right_int_less_or_equal(void)327 void compare_same_symbol_plus_left_plus_right_int_less_or_equal(void) {
328 int x = f(), y = x + 1;
329 clang_analyzer_denote(x, "$x");
330 ++x;
331 clang_analyzer_express(x); // expected-warning {{$x + 1}}
332 clang_analyzer_express(y); // expected-warning {{$x + 1}}
333 clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
334 }
335
compare_same_symbol_plus_left_minus_right_int_less_or_equal(void)336 void compare_same_symbol_plus_left_minus_right_int_less_or_equal(void) {
337 int x = f(), y = x - 1;
338 clang_analyzer_denote(x, "$x");
339 ++x;
340 clang_analyzer_express(x); // expected-warning {{$x + 1}}
341 clang_analyzer_express(y); // expected-warning {{$x - 1}}
342 clang_analyzer_eval(x <= y); // expected-warning {{FALSE}}
343 }
344
compare_same_symbol_minus_left_plus_right_int_less_or_equal(void)345 void compare_same_symbol_minus_left_plus_right_int_less_or_equal(void) {
346 int x = f(), y = x + 1;
347 clang_analyzer_denote(x, "$x");
348 --x;
349 clang_analyzer_express(x); // expected-warning {{$x - 1}}
350 clang_analyzer_express(y); // expected-warning {{$x + 1}}
351 clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
352 }
353
compare_same_symbol_minus_left_minus_right_int_less_or_equal(void)354 void compare_same_symbol_minus_left_minus_right_int_less_or_equal(void) {
355 int x = f(), y = x - 1;
356 clang_analyzer_denote(x, "$x");
357 --x;
358 clang_analyzer_express(x); // expected-warning {{$x - 1}}
359 clang_analyzer_express(y); // expected-warning {{$x - 1}}
360 clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
361 }
362
compare_different_symbol_less(void)363 void compare_different_symbol_less(void) {
364 int x = f(), y = f();
365 clang_analyzer_denote(x, "$x");
366 clang_analyzer_denote(y, "$y");
367 clang_analyzer_express(y); // expected-warning {{$y}}
368 clang_analyzer_express(x < y); // expected-warning {{$x - $y < 0}}
369 }
370
compare_different_symbol_plus_left_int_less(void)371 void compare_different_symbol_plus_left_int_less(void) {
372 int x = f(), y = f();
373 clang_analyzer_denote(x, "$x");
374 clang_analyzer_denote(y, "$y");
375 x += 1;
376 clang_analyzer_express(x); // expected-warning {{$x + 1}}
377 clang_analyzer_express(y); // expected-warning {{$y}}
378 clang_analyzer_express(x < y); // expected-warning {{$y - $x > 1}}
379 }
380
compare_different_symbol_minus_left_int_less(void)381 void compare_different_symbol_minus_left_int_less(void) {
382 int x = f(), y = f();
383 clang_analyzer_denote(x, "$x");
384 clang_analyzer_denote(y, "$y");
385 x -= 1;
386 clang_analyzer_express(x); // expected-warning {{$x - 1}}
387 clang_analyzer_express(y); // expected-warning {{$y}}
388 clang_analyzer_express(x < y); // expected-warning {{$x - $y < 1}}
389 }
390
compare_different_symbol_plus_right_int_less(void)391 void compare_different_symbol_plus_right_int_less(void) {
392 int x = f(), y = f();
393 clang_analyzer_denote(x, "$x");
394 clang_analyzer_denote(y, "$y");
395 y += 2;
396 clang_analyzer_express(y); // expected-warning {{$y + 2}}
397 clang_analyzer_express(x < y); // expected-warning {{$x - $y < 2}}
398 }
399
compare_different_symbol_minus_right_int_less(void)400 void compare_different_symbol_minus_right_int_less(void) {
401 int x = f(), y = f();
402 clang_analyzer_denote(x, "$x");
403 clang_analyzer_denote(y, "$y");
404 y -= 2;
405 clang_analyzer_express(y); // expected-warning {{$y - 2}}
406 clang_analyzer_express(x < y); // expected-warning {{$y - $x > 2}}
407 }
408
compare_different_symbol_plus_left_plus_right_int_less(void)409 void compare_different_symbol_plus_left_plus_right_int_less(void) {
410 int x = f(), y = f();
411 clang_analyzer_denote(x, "$x");
412 clang_analyzer_denote(y, "$y");
413 x += 2;
414 y += 1;
415 clang_analyzer_express(x); // expected-warning {{$x + 2}}
416 clang_analyzer_express(y); // expected-warning {{$y + 1}}
417 clang_analyzer_express(x < y); // expected-warning {{$y - $x > 1}}
418 }
419
compare_different_symbol_plus_left_minus_right_int_less(void)420 void compare_different_symbol_plus_left_minus_right_int_less(void) {
421 int x = f(), y = f();
422 clang_analyzer_denote(x, "$x");
423 clang_analyzer_denote(y, "$y");
424 x += 2;
425 y -= 1;
426 clang_analyzer_express(x); // expected-warning {{$x + 2}}
427 clang_analyzer_express(y); // expected-warning {{$y - 1}}
428 clang_analyzer_express(x < y); // expected-warning {{$y - $x > 3}}
429 }
430
compare_different_symbol_minus_left_plus_right_int_less(void)431 void compare_different_symbol_minus_left_plus_right_int_less(void) {
432 int x = f(), y = f();
433 clang_analyzer_denote(x, "$x");
434 clang_analyzer_denote(y, "$y");
435 x -= 2;
436 y += 1;
437 clang_analyzer_express(x); // expected-warning {{$x - 2}}
438 clang_analyzer_express(y); // expected-warning {{$y + 1}}
439 clang_analyzer_express(x < y); // expected-warning {{$x - $y < 3}}
440 }
441
compare_different_symbol_minus_left_minus_right_int_less(void)442 void compare_different_symbol_minus_left_minus_right_int_less(void) {
443 int x = f(), y = f();
444 clang_analyzer_denote(x, "$x");
445 clang_analyzer_denote(y, "$y");
446 x -= 2;
447 y -= 1;
448 clang_analyzer_express(x); // expected-warning {{$x - 2}}
449 clang_analyzer_express(y); // expected-warning {{$y - 1}}
450 clang_analyzer_express(x < y); // expected-warning {{$x - $y < 1}}
451 }
452
compare_same_symbol_less(void)453 void compare_same_symbol_less(void) {
454 int x = f(), y = x;
455 clang_analyzer_denote(x, "$x");
456 clang_analyzer_express(y); // expected-warning {{$x}}
457 clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
458 }
459
compare_same_symbol_plus_left_int_less(void)460 void compare_same_symbol_plus_left_int_less(void) {
461 int x = f(), y = x;
462 clang_analyzer_denote(x, "$x");
463 ++x;
464 clang_analyzer_express(x); // expected-warning {{$x + 1}}
465 clang_analyzer_express(y); // expected-warning {{$x}}
466 clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
467 }
468
compare_same_symbol_minus_left_int_less(void)469 void compare_same_symbol_minus_left_int_less(void) {
470 int x = f(), y = x;
471 clang_analyzer_denote(x, "$x");
472 --x;
473 clang_analyzer_express(x); // expected-warning {{$x - 1}}
474 clang_analyzer_express(y); // expected-warning {{$x}}
475 clang_analyzer_eval(x < y); // expected-warning {{TRUE}}
476 }
477
compare_same_symbol_plus_right_int_less(void)478 void compare_same_symbol_plus_right_int_less(void) {
479 int x = f(), y = x + 1;
480 clang_analyzer_denote(x, "$x");
481 clang_analyzer_express(y); // expected-warning {{$x + 1}}
482 clang_analyzer_eval(x < y); // expected-warning {{TRUE}}
483 }
484
compare_same_symbol_minus_right_int_less(void)485 void compare_same_symbol_minus_right_int_less(void) {
486 int x = f(), y = x - 1;
487 clang_analyzer_denote(x, "$x");
488 clang_analyzer_express(y); // expected-warning {{$x - 1}}
489 clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
490 }
491
compare_same_symbol_plus_left_plus_right_int_less(void)492 void compare_same_symbol_plus_left_plus_right_int_less(void) {
493 int x = f(), y = x + 1;
494 clang_analyzer_denote(x, "$x");
495 ++x;
496 clang_analyzer_express(x); // expected-warning {{$x + 1}}
497 clang_analyzer_express(y); // expected-warning {{$x + 1}}
498 clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
499 }
500
compare_same_symbol_plus_left_minus_right_int_less(void)501 void compare_same_symbol_plus_left_minus_right_int_less(void) {
502 int x = f(), y = x - 1;
503 clang_analyzer_denote(x, "$x");
504 ++x;
505 clang_analyzer_express(x); // expected-warning {{$x + 1}}
506 clang_analyzer_express(y); // expected-warning {{$x - 1}}
507 clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
508 }
509
compare_same_symbol_minus_left_plus_right_int_less(void)510 void compare_same_symbol_minus_left_plus_right_int_less(void) {
511 int x = f(), y = x + 1;
512 clang_analyzer_denote(x, "$x");
513 --x;
514 clang_analyzer_express(x); // expected-warning {{$x - 1}}
515 clang_analyzer_express(y); // expected-warning {{$x + 1}}
516 clang_analyzer_eval(x < y); // expected-warning {{TRUE}}
517 }
518
compare_same_symbol_minus_left_minus_right_int_less(void)519 void compare_same_symbol_minus_left_minus_right_int_less(void) {
520 int x = f(), y = x - 1;
521 clang_analyzer_denote(x, "$x");
522 --x;
523 clang_analyzer_express(x); // expected-warning {{$x - 1}}
524 clang_analyzer_express(y); // expected-warning {{$x - 1}}
525 clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
526 }
527
528 // Rearrange should happen on signed types only (tryRearrange):
529 //
530 // // Rearrange signed symbolic expressions only
531 // if (!SingleTy->isSignedIntegerOrEnumerationType())
532 // return std::nullopt;
533 //
534 // Without the symbolic casts, the SVal for `x` in `unsigned x = f()` will be
535 // the signed `int`. However, with the symbolic casts it will be `unsigned`.
536 // Thus, these tests are meaningful only if the cast is not emitted.
537 #ifndef SUPPORT_SYMBOLIC_INTEGER_CASTS
538
compare_different_symbol_equal_unsigned(void)539 void compare_different_symbol_equal_unsigned(void) {
540 unsigned x = f(), y = f();
541 clang_analyzer_denote(x, "$x");
542 clang_analyzer_denote(y, "$y");
543 clang_analyzer_express(y); // expected-warning {{$y}}
544 clang_analyzer_express(x == y); // expected-warning {{$x - $y == 0}}
545 }
546
compare_different_symbol_plus_left_int_equal_unsigned(void)547 void compare_different_symbol_plus_left_int_equal_unsigned(void) {
548 unsigned x = f() + 1, y = f();
549 clang_analyzer_denote(x - 1, "$x");
550 clang_analyzer_denote(y, "$y");
551 clang_analyzer_express(x); // expected-warning {{$x + 1}}
552 clang_analyzer_express(y); // expected-warning {{$y}}
553 clang_analyzer_express(x == y); // expected-warning {{$y - $x == 1}}
554 }
555
compare_different_symbol_minus_left_int_equal_unsigned(void)556 void compare_different_symbol_minus_left_int_equal_unsigned(void) {
557 unsigned x = f() - 1, y = f();
558 clang_analyzer_denote(x + 1, "$x");
559 clang_analyzer_denote(y, "$y");
560 clang_analyzer_express(x); // expected-warning {{$x - 1}}
561 clang_analyzer_express(y); // expected-warning {{$y}}
562 clang_analyzer_express(x == y); // expected-warning {{$x - $y == 1}}
563 }
564
compare_different_symbol_plus_right_int_equal_unsigned(void)565 void compare_different_symbol_plus_right_int_equal_unsigned(void) {
566 unsigned x = f(), y = f() + 2;
567 clang_analyzer_denote(x, "$x");
568 clang_analyzer_denote(y - 2, "$y");
569 clang_analyzer_express(y); // expected-warning {{$y + 2}}
570 clang_analyzer_express(x == y); // expected-warning {{$x - $y == 2}}
571 }
572
compare_different_symbol_minus_right_int_equal_unsigned(void)573 void compare_different_symbol_minus_right_int_equal_unsigned(void) {
574 unsigned x = f(), y = f() - 2;
575 clang_analyzer_denote(x, "$x");
576 clang_analyzer_denote(y + 2, "$y");
577 clang_analyzer_express(y); // expected-warning {{$y - 2}}
578 clang_analyzer_express(x == y); // expected-warning {{$y - $x == 2}}
579 }
580
compare_different_symbol_plus_left_plus_right_int_equal_unsigned(void)581 void compare_different_symbol_plus_left_plus_right_int_equal_unsigned(void) {
582 unsigned x = f() + 2, y = f() + 1;
583 clang_analyzer_denote(x - 2, "$x");
584 clang_analyzer_denote(y - 1, "$y");
585 clang_analyzer_express(x); // expected-warning {{$x + 2}}
586 clang_analyzer_express(y); // expected-warning {{$y + 1}}
587 clang_analyzer_express(x == y); // expected-warning {{$y - $x == 1}}
588 }
589
compare_different_symbol_plus_left_minus_right_int_equal_unsigned(void)590 void compare_different_symbol_plus_left_minus_right_int_equal_unsigned(void) {
591 unsigned x = f() + 2, y = f() - 1;
592 clang_analyzer_denote(x - 2, "$x");
593 clang_analyzer_denote(y + 1, "$y");
594 clang_analyzer_express(x); // expected-warning {{$x + 2}}
595 clang_analyzer_express(y); // expected-warning {{$y - 1}}
596 clang_analyzer_express(x == y); // expected-warning {{$y - $x == 3}}
597 }
598
compare_different_symbol_minus_left_plus_right_int_equal_unsigned(void)599 void compare_different_symbol_minus_left_plus_right_int_equal_unsigned(void) {
600 unsigned x = f() - 2, y = f() + 1;
601 clang_analyzer_denote(x + 2, "$x");
602 clang_analyzer_denote(y - 1, "$y");
603 clang_analyzer_express(x); // expected-warning {{$x - 2}}
604 clang_analyzer_express(y); // expected-warning {{$y + 1}}
605 clang_analyzer_express(x == y); // expected-warning {{$x - $y == 3}}
606 }
607
compare_different_symbol_minus_left_minus_right_int_equal_unsigned(void)608 void compare_different_symbol_minus_left_minus_right_int_equal_unsigned(void) {
609 unsigned x = f() - 2, y = f() - 1;
610 clang_analyzer_denote(x + 2, "$x");
611 clang_analyzer_denote(y + 1, "$y");
612 clang_analyzer_express(x); // expected-warning {{$x - 2}}
613 clang_analyzer_express(y); // expected-warning {{$y - 1}}
614 clang_analyzer_express(x == y); // expected-warning {{$x - $y == 1}}
615 }
616
compare_same_symbol_equal_unsigned(void)617 void compare_same_symbol_equal_unsigned(void) {
618 unsigned x = f(), y = x;
619 clang_analyzer_denote(x, "$x");
620 clang_analyzer_express(y); // expected-warning {{$x}}
621 clang_analyzer_eval(x == y); // expected-warning {{TRUE}}
622 }
623
compare_same_symbol_plus_left_int_equal_unsigned(void)624 void compare_same_symbol_plus_left_int_equal_unsigned(void) {
625 unsigned x = f(), y = x;
626 clang_analyzer_denote(x, "$x");
627 ++x;
628 clang_analyzer_express(x); // expected-warning {{$x + 1}}
629 clang_analyzer_express(y); // expected-warning {{$x}}
630 clang_analyzer_express(x == y); // expected-warning {{$x + 1U == $x}}
631 }
632
compare_same_symbol_minus_left_int_equal_unsigned(void)633 void compare_same_symbol_minus_left_int_equal_unsigned(void) {
634 unsigned x = f(), y = x;
635 clang_analyzer_denote(x, "$x");
636 --x;
637 clang_analyzer_express(x); // expected-warning {{$x - 1}}
638 clang_analyzer_express(y); // expected-warning {{$x}}
639 clang_analyzer_express(x == y); // expected-warning {{$x - 1U == $x}}
640 }
641
compare_same_symbol_plus_right_int_equal_unsigned(void)642 void compare_same_symbol_plus_right_int_equal_unsigned(void) {
643 unsigned x = f(), y = x + 1;
644 clang_analyzer_denote(x, "$x");
645 clang_analyzer_express(y); // expected-warning {{$x + 1}}
646 clang_analyzer_express(x == y); // expected-warning {{$x == $x + 1U}}
647 }
648
compare_same_symbol_minus_right_int_equal_unsigned(void)649 void compare_same_symbol_minus_right_int_equal_unsigned(void) {
650 unsigned x = f(), y = x - 1;
651 clang_analyzer_denote(x, "$x");
652 clang_analyzer_express(y); // expected-warning {{$x - 1}}
653 clang_analyzer_express(x == y); // expected-warning {{$x == $x - 1U}}
654 }
655
compare_same_symbol_plus_left_plus_right_int_equal_unsigned(void)656 void compare_same_symbol_plus_left_plus_right_int_equal_unsigned(void) {
657 unsigned x = f(), y = x + 1;
658 clang_analyzer_denote(x, "$x");
659 ++x;
660 clang_analyzer_express(x); // expected-warning {{$x + 1}}
661 clang_analyzer_express(y); // expected-warning {{$x + 1}}
662 clang_analyzer_eval(x == y); // expected-warning {{TRUE}}
663 }
664
compare_same_symbol_plus_left_minus_right_int_equal_unsigned(void)665 void compare_same_symbol_plus_left_minus_right_int_equal_unsigned(void) {
666 unsigned x = f(), y = x - 1;
667 clang_analyzer_denote(x, "$x");
668 ++x;
669 clang_analyzer_express(x); // expected-warning {{$x + 1}}
670 clang_analyzer_express(y); // expected-warning {{$x - 1}}
671 clang_analyzer_express(x == y); // expected-warning {{$x + 1U == $x - 1U}}
672 }
673
compare_same_symbol_minus_left_plus_right_int_equal_unsigned(void)674 void compare_same_symbol_minus_left_plus_right_int_equal_unsigned(void) {
675 unsigned x = f(), y = x + 1;
676 clang_analyzer_denote(x, "$x");
677 --x;
678 clang_analyzer_express(x); // expected-warning {{$x - 1}}
679 clang_analyzer_express(y); // expected-warning {{$x + 1}}
680 clang_analyzer_express(x == y); // expected-warning {{$x - 1U == $x + 1U}}
681 }
682
compare_same_symbol_minus_left_minus_right_int_equal_unsigned(void)683 void compare_same_symbol_minus_left_minus_right_int_equal_unsigned(void) {
684 unsigned x = f(), y = x - 1;
685 clang_analyzer_denote(x, "$x");
686 --x;
687 clang_analyzer_express(x); // expected-warning {{$x - 1}}
688 clang_analyzer_express(y); // expected-warning {{$x - 1}}
689 clang_analyzer_eval(x == y); // expected-warning {{TRUE}}
690 }
691
compare_different_symbol_less_or_equal_unsigned(void)692 void compare_different_symbol_less_or_equal_unsigned(void) {
693 unsigned x = f(), y = f();
694 clang_analyzer_denote(x, "$x");
695 clang_analyzer_denote(y, "$y");
696 clang_analyzer_express(y); // expected-warning {{$y}}
697 clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 0}}
698 }
699
compare_different_symbol_plus_left_int_less_or_equal_unsigned(void)700 void compare_different_symbol_plus_left_int_less_or_equal_unsigned(void) {
701 unsigned x = f() + 1, y = f();
702 clang_analyzer_denote(x - 1, "$x");
703 clang_analyzer_denote(y, "$y");
704 clang_analyzer_express(x); // expected-warning {{$x + 1}}
705 clang_analyzer_express(y); // expected-warning {{$y}}
706 clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 1}}
707 }
708
compare_different_symbol_minus_left_int_less_or_equal_unsigned(void)709 void compare_different_symbol_minus_left_int_less_or_equal_unsigned(void) {
710 unsigned x = f() - 1, y = f();
711 clang_analyzer_denote(x + 1, "$x");
712 clang_analyzer_denote(y, "$y");
713 clang_analyzer_express(x); // expected-warning {{$x - 1}}
714 clang_analyzer_express(y); // expected-warning {{$y}}
715 clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 1}}
716 }
717
compare_different_symbol_plus_right_int_less_or_equal_unsigned(void)718 void compare_different_symbol_plus_right_int_less_or_equal_unsigned(void) {
719 unsigned x = f(), y = f() + 2;
720 clang_analyzer_denote(x, "$x");
721 clang_analyzer_denote(y - 2, "$y");
722 clang_analyzer_express(y); // expected-warning {{$y + 2}}
723 clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 2}}
724 }
725
compare_different_symbol_minus_right_int_less_or_equal_unsigned(void)726 void compare_different_symbol_minus_right_int_less_or_equal_unsigned(void) {
727 unsigned x = f(), y = f() - 2;
728 clang_analyzer_denote(x, "$x");
729 clang_analyzer_denote(y + 2, "$y");
730 clang_analyzer_express(y); // expected-warning {{$y - 2}}
731 clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 2}}
732 }
733
compare_different_symbol_plus_left_plus_right_int_less_or_equal_unsigned(void)734 void compare_different_symbol_plus_left_plus_right_int_less_or_equal_unsigned(void) {
735 unsigned x = f() + 2, y = f() + 1;
736 clang_analyzer_denote(x - 2, "$x");
737 clang_analyzer_denote(y - 1, "$y");
738 clang_analyzer_express(x); // expected-warning {{$x + 2}}
739 clang_analyzer_express(y); // expected-warning {{$y + 1}}
740 clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 1}}
741 }
742
compare_different_symbol_plus_left_minus_right_int_less_or_equal_unsigned(void)743 void compare_different_symbol_plus_left_minus_right_int_less_or_equal_unsigned(void) {
744 unsigned x = f() + 2, y = f() - 1;
745 clang_analyzer_denote(x - 2, "$x");
746 clang_analyzer_denote(y + 1, "$y");
747 clang_analyzer_express(x); // expected-warning {{$x + 2}}
748 clang_analyzer_express(y); // expected-warning {{$y - 1}}
749 clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 3}}
750 }
751
compare_different_symbol_minus_left_plus_right_int_less_or_equal_unsigned(void)752 void compare_different_symbol_minus_left_plus_right_int_less_or_equal_unsigned(void) {
753 unsigned x = f() - 2, y = f() + 1;
754 clang_analyzer_denote(x + 2, "$x");
755 clang_analyzer_denote(y - 1, "$y");
756 clang_analyzer_express(x); // expected-warning {{$x - 2}}
757 clang_analyzer_express(y); // expected-warning {{$y + 1}}
758 clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 3}}
759 }
760
compare_different_symbol_minus_left_minus_right_int_less_or_equal_unsigned(void)761 void compare_different_symbol_minus_left_minus_right_int_less_or_equal_unsigned(void) {
762 unsigned x = f() - 2, y = f() - 1;
763 clang_analyzer_denote(x + 2, "$x");
764 clang_analyzer_denote(y + 1, "$y");
765 clang_analyzer_express(x); // expected-warning {{$x - 2}}
766 clang_analyzer_express(y); // expected-warning {{$y - 1}}
767 clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 1}}
768 }
769
compare_same_symbol_less_or_equal_unsigned(void)770 void compare_same_symbol_less_or_equal_unsigned(void) {
771 unsigned x = f(), y = x;
772 clang_analyzer_denote(x, "$x");
773 clang_analyzer_express(y); // expected-warning {{$x}}
774 clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
775 }
776
compare_same_symbol_plus_left_int_less_or_equal_unsigned(void)777 void compare_same_symbol_plus_left_int_less_or_equal_unsigned(void) {
778 unsigned x = f(), y = x;
779 clang_analyzer_denote(x, "$x");
780 ++x;
781 clang_analyzer_express(x); // expected-warning {{$x + 1}}
782 clang_analyzer_express(y); // expected-warning {{$x}}
783 clang_analyzer_express(x <= y); // expected-warning {{$x + 1U <= $x}}
784 }
785
compare_same_symbol_minus_left_int_less_or_equal_unsigned(void)786 void compare_same_symbol_minus_left_int_less_or_equal_unsigned(void) {
787 unsigned x = f(), y = x;
788 clang_analyzer_denote(x, "$x");
789 --x;
790 clang_analyzer_express(x); // expected-warning {{$x - 1}}
791 clang_analyzer_express(y); // expected-warning {{$x}}
792 clang_analyzer_express(x <= y); // expected-warning {{$x - 1U <= $x}}
793 }
794
compare_same_symbol_plus_right_int_less_or_equal_unsigned(void)795 void compare_same_symbol_plus_right_int_less_or_equal_unsigned(void) {
796 unsigned x = f(), y = x + 1;
797 clang_analyzer_denote(x, "$x");
798 clang_analyzer_express(y); // expected-warning {{$x + 1}}
799 clang_analyzer_express(x <= y); // expected-warning {{$x <= $x + 1U}}
800 }
801
compare_same_symbol_minus_right_int_less_or_equal_unsigned(void)802 void compare_same_symbol_minus_right_int_less_or_equal_unsigned(void) {
803 unsigned x = f(), y = x - 1;
804 clang_analyzer_denote(x, "$x");
805 clang_analyzer_express(y); // expected-warning {{$x - 1}}
806 clang_analyzer_express(x <= y); // expected-warning {{$x <= $x - 1U}}
807 }
808
compare_same_symbol_plus_left_plus_right_int_less_or_equal_unsigned(void)809 void compare_same_symbol_plus_left_plus_right_int_less_or_equal_unsigned(void) {
810 unsigned x = f(), y = x + 1;
811 clang_analyzer_denote(x, "$x");
812 ++x;
813 clang_analyzer_express(x); // expected-warning {{$x + 1}}
814 clang_analyzer_express(y); // expected-warning {{$x + 1}}
815 clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
816 }
817
compare_same_symbol_plus_left_minus_right_int_less_or_equal_unsigned(void)818 void compare_same_symbol_plus_left_minus_right_int_less_or_equal_unsigned(void) {
819 unsigned x = f(), y = x - 1;
820 clang_analyzer_denote(x, "$x");
821 ++x;
822 clang_analyzer_express(x); // expected-warning {{$x + 1}}
823 clang_analyzer_express(y); // expected-warning {{$x - 1}}
824 clang_analyzer_express(x <= y); // expected-warning {{$x + 1U <= $x - 1U}}
825 }
826
compare_same_symbol_minus_left_plus_right_int_less_or_equal_unsigned(void)827 void compare_same_symbol_minus_left_plus_right_int_less_or_equal_unsigned(void) {
828 unsigned x = f(), y = x + 1;
829 clang_analyzer_denote(x, "$x");
830 --x;
831 clang_analyzer_express(x); // expected-warning {{$x - 1}}
832 clang_analyzer_express(y); // expected-warning {{$x + 1}}
833 clang_analyzer_express(x <= y); // expected-warning {{$x - 1U <= $x + 1U}}
834 }
835
compare_same_symbol_minus_left_minus_right_int_less_or_equal_unsigned(void)836 void compare_same_symbol_minus_left_minus_right_int_less_or_equal_unsigned(void) {
837 unsigned x = f(), y = x - 1;
838 clang_analyzer_denote(x, "$x");
839 --x;
840 clang_analyzer_express(x); // expected-warning {{$x - 1}}
841 clang_analyzer_express(y); // expected-warning {{$x - 1}}
842 clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
843 }
844
compare_different_symbol_less_unsigned(void)845 void compare_different_symbol_less_unsigned(void) {
846 unsigned x = f(), y = f();
847 clang_analyzer_denote(x, "$x");
848 clang_analyzer_denote(y, "$y");
849 clang_analyzer_express(y); // expected-warning {{$y}}
850 clang_analyzer_express(x < y); // expected-warning {{$x - $y < 0}}
851 }
852
compare_different_symbol_plus_left_int_less_unsigned(void)853 void compare_different_symbol_plus_left_int_less_unsigned(void) {
854 unsigned x = f() + 1, y = f();
855 clang_analyzer_denote(x - 1, "$x");
856 clang_analyzer_denote(y, "$y");
857 clang_analyzer_express(x); // expected-warning {{$x + 1}}
858 clang_analyzer_express(y); // expected-warning {{$y}}
859 clang_analyzer_express(x < y); // expected-warning {{$y - $x > 1}}
860 }
861
compare_different_symbol_minus_left_int_less_unsigned(void)862 void compare_different_symbol_minus_left_int_less_unsigned(void) {
863 unsigned x = f() - 1, y = f();
864 clang_analyzer_denote(x + 1, "$x");
865 clang_analyzer_denote(y, "$y");
866 clang_analyzer_express(x); // expected-warning {{$x - 1}}
867 clang_analyzer_express(y); // expected-warning {{$y}}
868 clang_analyzer_express(x < y); // expected-warning {{$x - $y < 1}}
869 }
870
compare_different_symbol_plus_right_int_less_unsigned(void)871 void compare_different_symbol_plus_right_int_less_unsigned(void) {
872 unsigned x = f(), y = f() + 2;
873 clang_analyzer_denote(x, "$x");
874 clang_analyzer_denote(y - 2, "$y");
875 clang_analyzer_express(y); // expected-warning {{$y + 2}}
876 clang_analyzer_express(x < y); // expected-warning {{$x - $y < 2}}
877 }
878
compare_different_symbol_minus_right_int_less_unsigned(void)879 void compare_different_symbol_minus_right_int_less_unsigned(void) {
880 unsigned x = f(), y = f() - 2;
881 clang_analyzer_denote(x, "$x");
882 clang_analyzer_denote(y + 2, "$y");
883 clang_analyzer_express(y); // expected-warning {{$y - 2}}
884 clang_analyzer_express(x < y); // expected-warning {{$y - $x > 2}}
885 }
886
compare_different_symbol_plus_left_plus_right_int_less_unsigned(void)887 void compare_different_symbol_plus_left_plus_right_int_less_unsigned(void) {
888 unsigned x = f() + 2, y = f() + 1;
889 clang_analyzer_denote(x - 2, "$x");
890 clang_analyzer_denote(y - 1, "$y");
891 clang_analyzer_express(x); // expected-warning {{$x + 2}}
892 clang_analyzer_express(y); // expected-warning {{$y + 1}}
893 clang_analyzer_express(x < y); // expected-warning {{$y - $x > 1}}
894 }
895
compare_different_symbol_plus_left_minus_right_int_less_unsigned(void)896 void compare_different_symbol_plus_left_minus_right_int_less_unsigned(void) {
897 unsigned x = f() + 2, y = f() - 1;
898 clang_analyzer_denote(x - 2, "$x");
899 clang_analyzer_denote(y + 1, "$y");
900 clang_analyzer_express(x); // expected-warning {{$x + 2}}
901 clang_analyzer_express(y); // expected-warning {{$y - 1}}
902 clang_analyzer_express(x < y); // expected-warning {{$y - $x > 3}}
903 }
904
compare_different_symbol_minus_left_plus_right_int_less_unsigned(void)905 void compare_different_symbol_minus_left_plus_right_int_less_unsigned(void) {
906 unsigned x = f() - 2, y = f() + 1;
907 clang_analyzer_denote(x + 2, "$x");
908 clang_analyzer_denote(y - 1, "$y");
909 clang_analyzer_express(x); // expected-warning {{$x - 2}}
910 clang_analyzer_express(y); // expected-warning {{$y + 1}}
911 clang_analyzer_express(x < y); // expected-warning {{$x - $y < 3}}
912 }
913
compare_different_symbol_minus_left_minus_right_int_less_unsigned(void)914 void compare_different_symbol_minus_left_minus_right_int_less_unsigned(void) {
915 unsigned x = f() - 2, y = f() - 1;
916 clang_analyzer_denote(x + 2, "$x");
917 clang_analyzer_denote(y + 1, "$y");
918 clang_analyzer_express(x); // expected-warning {{$x - 2}}
919 clang_analyzer_express(y); // expected-warning {{$y - 1}}
920 clang_analyzer_express(x < y); // expected-warning {{$x - $y < 1}}
921 }
922
923 #endif
924
925 // These pass even with aggressive-binary-operation-simplification=false
926
compare_same_symbol_less_unsigned(void)927 void compare_same_symbol_less_unsigned(void) {
928 unsigned x = f(), y = x;
929 clang_analyzer_denote(x, "$x");
930 clang_analyzer_express(y); // expected-warning {{$x}}
931 clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
932 }
933
compare_same_symbol_plus_left_int_less_unsigned(void)934 void compare_same_symbol_plus_left_int_less_unsigned(void) {
935 unsigned x = f(), y = x;
936 clang_analyzer_denote(x, "$x");
937 ++x;
938 clang_analyzer_express(x); // expected-warning {{$x + 1}}
939 clang_analyzer_express(y); // expected-warning {{$x}}
940 clang_analyzer_express(x < y); // expected-warning {{$x + 1U < $x}}
941 }
942
compare_same_symbol_minus_left_int_less_unsigned(void)943 void compare_same_symbol_minus_left_int_less_unsigned(void) {
944 unsigned x = f(), y = x;
945 clang_analyzer_denote(x, "$x");
946 --x;
947 clang_analyzer_express(x); // expected-warning {{$x - 1}}
948 clang_analyzer_express(y); // expected-warning {{$x}}
949 clang_analyzer_express(x < y); // expected-warning {{$x - 1U < $x}}
950 }
951
compare_same_symbol_plus_right_int_less_unsigned(void)952 void compare_same_symbol_plus_right_int_less_unsigned(void) {
953 unsigned x = f(), y = x + 1;
954 clang_analyzer_denote(x, "$x");
955 clang_analyzer_express(y); // expected-warning {{$x + 1}}
956 clang_analyzer_express(x < y); // expected-warning {{$x < $x + 1U}}
957 }
958
compare_same_symbol_minus_right_int_less_unsigned(void)959 void compare_same_symbol_minus_right_int_less_unsigned(void) {
960 unsigned x = f(), y = x - 1;
961 clang_analyzer_denote(x, "$x");
962 clang_analyzer_express(y); // expected-warning {{$x - 1}}
963 clang_analyzer_express(x < y); // expected-warning {{$x < $x - 1U}}
964 }
965
compare_same_symbol_plus_left_plus_right_int_less_unsigned(void)966 void compare_same_symbol_plus_left_plus_right_int_less_unsigned(void) {
967 unsigned x = f(), y = x + 1;
968 clang_analyzer_denote(x, "$x");
969 ++x;
970 clang_analyzer_express(x); // expected-warning {{$x + 1}}
971 clang_analyzer_express(y); // expected-warning {{$x + 1}}
972 clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
973 }
974
compare_same_symbol_plus_left_minus_right_int_less_unsigned(void)975 void compare_same_symbol_plus_left_minus_right_int_less_unsigned(void) {
976 unsigned x = f(), y = x - 1;
977 clang_analyzer_denote(x, "$x");
978 ++x;
979 clang_analyzer_express(x); // expected-warning {{$x + 1}}
980 clang_analyzer_express(y); // expected-warning {{$x - 1}}
981 clang_analyzer_express(x < y); // expected-warning {{$x + 1U < $x - 1U}}
982 }
983
compare_same_symbol_minus_left_plus_right_int_less_unsigned(void)984 void compare_same_symbol_minus_left_plus_right_int_less_unsigned(void) {
985 unsigned x = f(), y = x + 1;
986 clang_analyzer_denote(x, "$x");
987 --x;
988 clang_analyzer_express(x); // expected-warning {{$x - 1}}
989 clang_analyzer_express(y); // expected-warning {{$x + 1}}
990 clang_analyzer_express(x < y); // expected-warning {{$x - 1U < $x + 1U}}
991 }
992
compare_same_symbol_minus_left_minus_right_int_less_unsigned(void)993 void compare_same_symbol_minus_left_minus_right_int_less_unsigned(void) {
994 unsigned x = f(), y = x - 1;
995 clang_analyzer_denote(x, "$x");
996 --x;
997 clang_analyzer_express(x); // expected-warning {{$x - 1}}
998 clang_analyzer_express(y); // expected-warning {{$x - 1}}
999 clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
1000 }
1001
overflow(signed char n,signed char m)1002 void overflow(signed char n, signed char m) {
1003 if (n + 0 > m + 0) {
1004 clang_analyzer_eval(n - 126 == m + 3); // expected-warning {{UNKNOWN}}
1005 }
1006 }
1007
mixed_integer_types(int x,int y)1008 int mixed_integer_types(int x, int y) {
1009 short a = x - 1U;
1010 return a - y;
1011 }
1012
1013 unsigned gu(void);
fu(void)1014 unsigned fu(void) {
1015 unsigned x = gu();
1016 // Assert that no overflows occur in this test file.
1017 // Assuming that concrete integers are also within that range.
1018 assert(x <= ((unsigned)UINT_MAX / 4));
1019 return x;
1020 }
1021
unsigned_concrete_int_no_crash(void)1022 void unsigned_concrete_int_no_crash(void) {
1023 unsigned x = fu() + 1U, y = fu() + 1U;
1024 clang_analyzer_denote(x - 1U, "$x");
1025 clang_analyzer_denote(y - 1U, "$y");
1026 clang_analyzer_express(y); // expected-warning {{$y}}
1027 clang_analyzer_express(x == y); // expected-warning {{$x + 1U == $y + 1U}}
1028 }
1029