blob: 1a87ccfe7056c4b5bc4dbe5fe7dd809432e7c9fd [file] [log] [blame]
Anna Zaksbb2a6862012-02-20 21:10:37 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.deadcode.UnreachableCode,unix.Malloc -verify -analyzer-constraints=basic %s
2// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.deadcode.UnreachableCode,unix.Malloc -verify -analyzer-constraints=range %s
Jordy Roseba0f61c2010-06-18 22:49:11 +00003
4// These are used to trigger warnings.
5typedef typeof(sizeof(int)) size_t;
6void *malloc(size_t);
7void free(void *);
8#define NULL ((void*)0)
Jordy Rose9e607dd2012-05-03 07:33:56 +00009#define UINT_MAX (~0U)
Jordy Roseba0f61c2010-06-18 22:49:11 +000010
11//---------------
12// Plus/minus
13//---------------
14
15void separateExpressions (int a) {
16 int b = a + 1;
17 --b;
18
Jordy Rose9e607dd2012-05-03 07:33:56 +000019 void *buf = malloc(1);
Jordy Roseba0f61c2010-06-18 22:49:11 +000020 if (a != 0 && b == 0)
Tom Carec4b5bd82010-07-23 23:04:53 +000021 return; // expected-warning{{never executed}}
Jordy Roseba0f61c2010-06-18 22:49:11 +000022 free(buf);
23}
24
25void oneLongExpression (int a) {
26 // Expression canonicalization should still allow this to work, even though
27 // the first term is on the left.
28 int b = 15 + a + 15 - 10 - 20;
29
Jordy Rose9e607dd2012-05-03 07:33:56 +000030 void *buf = malloc(1);
Jordy Roseba0f61c2010-06-18 22:49:11 +000031 if (a != 0 && b == 0)
Tom Carec4b5bd82010-07-23 23:04:53 +000032 return; // expected-warning{{never executed}}
Jordy Roseba0f61c2010-06-18 22:49:11 +000033 free(buf);
34}
35
Jordy Roseb4954a42010-06-21 20:15:15 +000036void mixedTypes (int a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +000037 void *buf = malloc(1);
Jordy Roseb4954a42010-06-21 20:15:15 +000038
39 // Different additive types should not cause crashes when constant-folding.
40 // This is part of PR7406.
41 int b = a + 1LL;
42 if (a != 0 && (b-1) == 0) // not crash
Tom Carec4b5bd82010-07-23 23:04:53 +000043 return; // expected-warning{{never executed}}
Jordy Roseb4954a42010-06-21 20:15:15 +000044
45 int c = a + 1U;
46 if (a != 0 && (c-1) == 0) // not crash
Tom Carec4b5bd82010-07-23 23:04:53 +000047 return; // expected-warning{{never executed}}
Jordy Roseb4954a42010-06-21 20:15:15 +000048
49 free(buf);
50}
51
Jordy Roseba0f61c2010-06-18 22:49:11 +000052//---------------
53// Comparisons
54//---------------
55
56// Equality and inequality only
57void eq_ne (unsigned a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +000058 void *b = NULL;
Jordy Roseba0f61c2010-06-18 22:49:11 +000059 if (a == UINT_MAX)
60 b = malloc(1);
61 if (a+1 != 0)
62 return; // no-warning
63 if (a-1 != UINT_MAX-1)
Tom Care7bce3a12010-07-27 23:30:21 +000064 return; // no-warning
Jordy Roseba0f61c2010-06-18 22:49:11 +000065 free(b);
66}
67
68void ne_eq (unsigned a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +000069 void *b = NULL;
Jordy Roseba0f61c2010-06-18 22:49:11 +000070 if (a != UINT_MAX)
71 b = malloc(1);
72 if (a+1 == 0)
73 return; // no-warning
74 if (a-1 == UINT_MAX-1)
Tom Care7bce3a12010-07-27 23:30:21 +000075 return; // no-warning
Jordy Roseba0f61c2010-06-18 22:49:11 +000076 free(b);
77}
78
Jordy Roseb4954a42010-06-21 20:15:15 +000079// Mixed typed inequalities (part of PR7406)
80// These should not crash.
81void mixed_eq_ne (int a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +000082 void *b = NULL;
Jordy Roseb4954a42010-06-21 20:15:15 +000083 if (a == 1)
84 b = malloc(1);
85 if (a+1U != 2)
86 return; // no-warning
87 if (a-1U != 0)
Tom Carec4b5bd82010-07-23 23:04:53 +000088 return; // expected-warning{{never executed}}
Jordy Roseb4954a42010-06-21 20:15:15 +000089 free(b);
90}
91
92void mixed_ne_eq (int a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +000093 void *b = NULL;
Jordy Roseb4954a42010-06-21 20:15:15 +000094 if (a != 1)
95 b = malloc(1);
96 if (a+1U == 2)
97 return; // no-warning
98 if (a-1U == 0)
Tom Carec4b5bd82010-07-23 23:04:53 +000099 return; // expected-warning{{never executed}}
Jordy Roseb4954a42010-06-21 20:15:15 +0000100 free(b);
101}
102
Jordy Roseba0f61c2010-06-18 22:49:11 +0000103
104// Simple order comparisons with no adjustment
105void baselineGT (unsigned a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +0000106 void *b = NULL;
Jordy Roseba0f61c2010-06-18 22:49:11 +0000107 if (a > 0)
108 b = malloc(1);
109 if (a == 0)
110 return; // no-warning
111 free(b);
112}
113
114void baselineGE (unsigned a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +0000115 void *b = NULL;
Jordy Roseba0f61c2010-06-18 22:49:11 +0000116 if (a >= UINT_MAX)
117 b = malloc(1);
118 if (a == UINT_MAX)
119 free(b);
120 return; // no-warning
121}
122
123void baselineLT (unsigned a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +0000124 void *b = NULL;
Jordy Roseba0f61c2010-06-18 22:49:11 +0000125 if (a < UINT_MAX)
126 b = malloc(1);
127 if (a == UINT_MAX)
128 return; // no-warning
129 free(b);
130}
131
132void baselineLE (unsigned a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +0000133 void *b = NULL;
Jordy Roseba0f61c2010-06-18 22:49:11 +0000134 if (a <= 0)
135 b = malloc(1);
136 if (a == 0)
137 free(b);
138 return; // no-warning
139}
140
141
142// Adjustment gives each of these an extra solution!
143void adjustedGT (unsigned a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +0000144 void *b = NULL;
Jordy Roseba0f61c2010-06-18 22:49:11 +0000145 if (a-1 > UINT_MAX-1)
146 b = malloc(1);
147 return; // expected-warning{{leak}}
148}
149
150void adjustedGE (unsigned a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +0000151 void *b = NULL;
Jordy Roseba0f61c2010-06-18 22:49:11 +0000152 if (a-1 >= UINT_MAX-1)
153 b = malloc(1);
154 if (a == UINT_MAX)
155 free(b);
156 return; // expected-warning{{leak}}
157}
158
159void adjustedLT (unsigned a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +0000160 void *b = NULL;
Jordy Roseba0f61c2010-06-18 22:49:11 +0000161 if (a+1 < 1)
162 b = malloc(1);
163 return; // expected-warning{{leak}}
164}
165
166void adjustedLE (unsigned a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +0000167 void *b = NULL;
Jordy Roseba0f61c2010-06-18 22:49:11 +0000168 if (a+1 <= 1)
169 b = malloc(1);
170 if (a == 0)
171 free(b);
172 return; // expected-warning{{leak}}
173}
174
175
176// Tautologies
177void tautologyGT (unsigned a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +0000178 void *b = malloc(1);
Jordy Roseba0f61c2010-06-18 22:49:11 +0000179 if (a > UINT_MAX)
Tom Care7bce3a12010-07-27 23:30:21 +0000180 return; // no-warning
Jordy Roseba0f61c2010-06-18 22:49:11 +0000181 free(b);
182}
183
184void tautologyGE (unsigned a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +0000185 void *b = malloc(1);
John McCall8205c1a2010-09-08 02:01:27 +0000186 if (a >= 0) // expected-warning{{always true}}
Jordy Roseba0f61c2010-06-18 22:49:11 +0000187 free(b);
188 return; // no-warning
189}
190
191void tautologyLT (unsigned a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +0000192 void *b = malloc(1);
John McCall8205c1a2010-09-08 02:01:27 +0000193 if (a < 0) // expected-warning{{always false}}
Tom Carec4b5bd82010-07-23 23:04:53 +0000194 return; // expected-warning{{never executed}}
Jordy Roseba0f61c2010-06-18 22:49:11 +0000195 free(b);
196}
197
198void tautologyLE (unsigned a) {
Jordy Rose9e607dd2012-05-03 07:33:56 +0000199 void *b = malloc(1);
Jordy Roseba0f61c2010-06-18 22:49:11 +0000200 if (a <= UINT_MAX)
201 free(b);
202 return; // no-warning
203}
Jordy Rose14d20b12012-05-03 07:34:01 +0000204
205
206// PR12206/12510 - When SimpleSValBuilder figures out that a symbol is fully
207// constrained, it should cast the value to the result type in a binary
208// operation...unless the binary operation is a comparison, in which case the
209// two arguments should be the same type, but won't match the result type.
210//
211// This is easier to trigger in C++ mode, where the comparison result type is
212// 'bool' and is thus differently sized from int on pretty much every system.
213//
214// This is not directly related to additive folding, but we use SValBuilder's
215// additive folding to tickle the bug. ExprEngine will simplify fully-constrained
216// symbols, so SValBuilder will only see them if they are (a) part of an evaluated
217// SymExpr (e.g. with additive folding) or (b) generated by a checker (e.g.
218// unix.cstring's strlen() modelling).
219void PR12206(int x) {
220 // Build a SymIntExpr, dependent on x.
221 int local = x - 1;
222
223 // Constrain the value of x.
224 int value = 1 + (1 << (8 * sizeof(1 == 1))); // not representable by bool
225 if (x != value) return;
226
227 // Constant-folding will turn (local+1) back into the symbol for x.
228 // The point of this dance is to make SValBuilder be responsible for
229 // turning the symbol into a ConcreteInt, rather than ExprEngine.
230
231 // Test relational operators.
232 if ((local + 1) < 2)
233 malloc(1); // expected-warning{{never executed}}
234 if (2 > (local + 1))
235 malloc(1); // expected-warning{{never executed}}
236
237 // Test equality operators.
238 if ((local + 1) == 1)
239 malloc(1); // expected-warning{{never executed}}
240 if (1 == (local + 1))
241 malloc(1); // expected-warning{{never executed}}
242}