1 | // This test checks that intersecting ranges does not cause 'system is over constrained' assertions in the case of eg: 32 bits unsigned integers getting their range from 64 bits signed integers. |
2 | // RUN: %clang_analyze_cc1 -triple x86_64-pc-linux-gnu -analyzer-checker=core,debug.ExprInspection -analyzer-store=region -verify %s |
3 | |
4 | void clang_analyzer_warnIfReached(); |
5 | |
6 | void f1(long foo) |
7 | { |
8 | unsigned index = -1; |
9 | if (index < foo) index = foo; |
10 | if (index + 1 == 0) // because of foo range, index is in range [0; UINT_MAX] |
11 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
12 | else |
13 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
14 | } |
15 | |
16 | void f2(unsigned long foo) |
17 | { |
18 | int index = -1; |
19 | if (index < foo) index = foo; // index equals ULONG_MAX |
20 | if (index + 1 == 0) |
21 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
22 | else |
23 | clang_analyzer_warnIfReached(); // no-warning |
24 | } |
25 | |
26 | void f3(unsigned long foo) |
27 | { |
28 | unsigned index = -1; |
29 | if (index < foo) index = foo; |
30 | if (index + 1 == 0) |
31 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
32 | else |
33 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
34 | } |
35 | |
36 | void f4(long foo) |
37 | { |
38 | int index = -1; |
39 | if (index < foo) index = foo; |
40 | if (index + 1 == 0) |
41 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
42 | else |
43 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
44 | } |
45 | |
46 | void f5(long foo) |
47 | { |
48 | unsigned index = -1; |
49 | if (index < foo) index = foo; |
50 | if (index == -1) |
51 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
52 | else |
53 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
54 | } |
55 | |
56 | void f6(long foo) |
57 | { |
58 | unsigned index = -1; |
59 | if (index < foo) index = foo; |
60 | if (index == -1) |
61 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
62 | else |
63 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
64 | } |
65 | |
66 | void f7(long foo) |
67 | { |
68 | unsigned index = -1; |
69 | if (index < foo) index = foo; |
70 | if (index - 1 == 0) // Was not reached prior fix. |
71 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
72 | else |
73 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
74 | } |
75 | |
76 | void f8(long foo) |
77 | { |
78 | unsigned index = -1; |
79 | if (index < foo) index = foo; |
80 | if (index + 1L == 0L) |
81 | clang_analyzer_warnIfReached(); // no-warning |
82 | else |
83 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
84 | } |
85 | |
86 | void f9(long foo) |
87 | { |
88 | unsigned index = -1; |
89 | if (index < foo) index = foo; |
90 | if (index - 1L == 0L) // Was not reached prior fix. |
91 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
92 | else |
93 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
94 | } |
95 | |
96 | void f10(long foo) |
97 | { |
98 | unsigned index = -1; |
99 | if (index < foo) index = foo; |
100 | if (index + 1 == 0L) |
101 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
102 | else |
103 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
104 | } |
105 | |
106 | void f11(long foo) |
107 | { |
108 | unsigned index = -1; |
109 | if (index < foo) index = foo; |
110 | if (index + 1UL == 0L) |
111 | clang_analyzer_warnIfReached(); // no-warning |
112 | else |
113 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
114 | } |
115 | |
116 | void f12(long foo) |
117 | { |
118 | unsigned index = -1; |
119 | if (index < foo) index = foo; |
120 | if (index - 1UL == 0L) // Was not reached prior fix. |
121 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
122 | else |
123 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
124 | } |
125 | |
126 | void f13(int foo) |
127 | { |
128 | unsigned short index = -1; |
129 | if (index < foo) index = foo; |
130 | if (index + 1 == 0) |
131 | clang_analyzer_warnIfReached(); // no-warning |
132 | else |
133 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
134 | } |
135 | |
136 | void f14(long foo) |
137 | { |
138 | unsigned index = -1; |
139 | if (index < foo) index = foo; |
140 | long bar = foo; |
141 | if (index + 1 == 0) |
142 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
143 | else |
144 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
145 | } |
146 | |
147 | void f15(long foo) |
148 | { |
149 | unsigned index = -1; |
150 | if (index < foo) index = foo; |
151 | unsigned int tmp = index + 1; |
152 | if (tmp == 0) |
153 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
154 | else |
155 | clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} |
156 | } |
157 | |