annotate clang/test/Analysis/uninit-vals.m @ 236:c4bab56944e8 llvm-original

LLVM 16
author kono
date Wed, 09 Nov 2022 17:45:10 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
1 // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-output=text -verify %s
150
anatofuz
parents:
diff changeset
2
anatofuz
parents:
diff changeset
3 typedef unsigned int NSUInteger;
anatofuz
parents:
diff changeset
4 typedef __typeof__(sizeof(int)) size_t;
anatofuz
parents:
diff changeset
5
anatofuz
parents:
diff changeset
6 void *malloc(size_t);
anatofuz
parents:
diff changeset
7 void *calloc(size_t nmemb, size_t size);
anatofuz
parents:
diff changeset
8 void free(void *);
anatofuz
parents:
diff changeset
9
anatofuz
parents:
diff changeset
10 void clang_analyzer_eval(int);
anatofuz
parents:
diff changeset
11
anatofuz
parents:
diff changeset
12 struct s {
anatofuz
parents:
diff changeset
13 int data;
anatofuz
parents:
diff changeset
14 };
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 struct s global;
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 void g(int);
anatofuz
parents:
diff changeset
19
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
20 void f4(void) {
150
anatofuz
parents:
diff changeset
21 int a;
anatofuz
parents:
diff changeset
22 if (global.data == 0)
anatofuz
parents:
diff changeset
23 a = 3;
anatofuz
parents:
diff changeset
24 if (global.data == 0) // When the true branch is feasible 'a = 3'.
anatofuz
parents:
diff changeset
25 g(a); // no-warning
anatofuz
parents:
diff changeset
26 }
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28
anatofuz
parents:
diff changeset
29 // Test uninitialized value due to part of the structure being uninitialized.
anatofuz
parents:
diff changeset
30 struct TestUninit { int x; int y; };
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
31 struct TestUninit test_uninit_aux(void);
150
anatofuz
parents:
diff changeset
32 void test_unit_aux2(int);
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
33 void test_uninit_pos(void) {
150
anatofuz
parents:
diff changeset
34 struct TestUninit v1 = { 0, 0 };
anatofuz
parents:
diff changeset
35 struct TestUninit v2 = test_uninit_aux();
anatofuz
parents:
diff changeset
36 int z; // expected-note{{'z' declared without an initial value}}
anatofuz
parents:
diff changeset
37 v1.y = z; // expected-warning{{Assigned value is garbage or undefined}}
anatofuz
parents:
diff changeset
38 // expected-note@-1{{Assigned value is garbage or undefined}}
anatofuz
parents:
diff changeset
39 test_unit_aux2(v2.x + v1.y);
anatofuz
parents:
diff changeset
40 }
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
41 void test_uninit_pos_2(void) {
150
anatofuz
parents:
diff changeset
42 struct TestUninit v1 = { 0, 0 };
anatofuz
parents:
diff changeset
43 struct TestUninit v2;
anatofuz
parents:
diff changeset
44 test_unit_aux2(v2.x + v1.y); // expected-warning{{The left operand of '+' is a garbage value}}
anatofuz
parents:
diff changeset
45 // expected-note@-1{{The left operand of '+' is a garbage value}}
anatofuz
parents:
diff changeset
46 }
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
47 void test_uninit_pos_3(void) {
150
anatofuz
parents:
diff changeset
48 struct TestUninit v1 = { 0, 0 };
anatofuz
parents:
diff changeset
49 struct TestUninit v2;
anatofuz
parents:
diff changeset
50 test_unit_aux2(v1.y + v2.x); // expected-warning{{The right operand of '+' is a garbage value}}
anatofuz
parents:
diff changeset
51 // expected-note@-1{{The right operand of '+' is a garbage value}}
anatofuz
parents:
diff changeset
52 }
anatofuz
parents:
diff changeset
53
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
54 void test_uninit_neg(void) {
150
anatofuz
parents:
diff changeset
55 struct TestUninit v1 = { 0, 0 };
anatofuz
parents:
diff changeset
56 struct TestUninit v2 = test_uninit_aux();
anatofuz
parents:
diff changeset
57 test_unit_aux2(v2.x + v1.y);
anatofuz
parents:
diff changeset
58 }
anatofuz
parents:
diff changeset
59
anatofuz
parents:
diff changeset
60 extern void test_uninit_struct_arg_aux(struct TestUninit arg);
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
61 void test_uninit_struct_arg(void) {
150
anatofuz
parents:
diff changeset
62 struct TestUninit x; // expected-note{{'x' initialized here}}
anatofuz
parents:
diff changeset
63 test_uninit_struct_arg_aux(x); // expected-warning{{Passed-by-value struct argument contains uninitialized data (e.g., field: 'x')}}
anatofuz
parents:
diff changeset
64 // expected-note@-1{{Passed-by-value struct argument contains uninitialized data (e.g., field: 'x')}}
anatofuz
parents:
diff changeset
65 }
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 @interface Foo
anatofuz
parents:
diff changeset
68 - (void) passVal:(struct TestUninit)arg;
anatofuz
parents:
diff changeset
69 @end
anatofuz
parents:
diff changeset
70 void testFoo(Foo *o) {
anatofuz
parents:
diff changeset
71 struct TestUninit x; // expected-note{{'x' initialized here}}
anatofuz
parents:
diff changeset
72 [o passVal:x]; // expected-warning{{Passed-by-value struct argument contains uninitialized data (e.g., field: 'x')}}
anatofuz
parents:
diff changeset
73 // expected-note@-1{{Passed-by-value struct argument contains uninitialized data (e.g., field: 'x')}}
anatofuz
parents:
diff changeset
74 }
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76 // Test case from <rdar://problem/7780304>. That shows an uninitialized value
anatofuz
parents:
diff changeset
77 // being used in the LHS of a compound assignment.
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
78 void rdar_7780304(void) {
150
anatofuz
parents:
diff changeset
79 typedef struct s_r7780304 { int x; } s_r7780304;
anatofuz
parents:
diff changeset
80 s_r7780304 b;
anatofuz
parents:
diff changeset
81 b.x |= 1; // expected-warning{{The left expression of the compound assignment is an uninitialized value. The computed value will also be garbage}}
anatofuz
parents:
diff changeset
82 // expected-note@-1{{The left expression of the compound assignment is an uninitialized value. The computed value will also be garbage}}
anatofuz
parents:
diff changeset
83 }
anatofuz
parents:
diff changeset
84
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86 // The flip side of PR10163 -- float arrays that are actually uninitialized
anatofuz
parents:
diff changeset
87 void test_PR10163(float);
anatofuz
parents:
diff changeset
88 void PR10163 (void) {
anatofuz
parents:
diff changeset
89 float x[2];
anatofuz
parents:
diff changeset
90 test_PR10163(x[1]); // expected-warning{{uninitialized value}}
anatofuz
parents:
diff changeset
91 // expected-note@-1{{1st function call argument is an uninitialized value}}
anatofuz
parents:
diff changeset
92 }
anatofuz
parents:
diff changeset
93
anatofuz
parents:
diff changeset
94 // PR10163 -- don't warn for default-initialized float arrays.
anatofuz
parents:
diff changeset
95 void PR10163_default_initialized_arrays(void) {
anatofuz
parents:
diff changeset
96 float x[2] = {0};
anatofuz
parents:
diff changeset
97 test_PR10163(x[1]); // no-warning
anatofuz
parents:
diff changeset
98 }
anatofuz
parents:
diff changeset
99
anatofuz
parents:
diff changeset
100 struct MyStr {
anatofuz
parents:
diff changeset
101 int x;
anatofuz
parents:
diff changeset
102 int y;
anatofuz
parents:
diff changeset
103 };
anatofuz
parents:
diff changeset
104 void swap(struct MyStr *To, struct MyStr *From) {
anatofuz
parents:
diff changeset
105 // This is not really a swap but close enough for our test.
anatofuz
parents:
diff changeset
106 To->x = From->x;
anatofuz
parents:
diff changeset
107 To->y = From->y; // expected-note{{Uninitialized value stored to field 'y'}}
anatofuz
parents:
diff changeset
108 }
anatofuz
parents:
diff changeset
109 int test_undefined_member_assignment_in_swap(struct MyStr *s2) {
anatofuz
parents:
diff changeset
110 struct MyStr s1;
anatofuz
parents:
diff changeset
111 s1.x = 5;
anatofuz
parents:
diff changeset
112 swap(s2, &s1); // expected-note{{Calling 'swap'}}
anatofuz
parents:
diff changeset
113 // expected-note@-1{{Returning from 'swap'}}
anatofuz
parents:
diff changeset
114 return s2->y; // expected-warning{{Undefined or garbage value returned to caller}}
anatofuz
parents:
diff changeset
115 // expected-note@-1{{Undefined or garbage value returned to caller}}
anatofuz
parents:
diff changeset
116 }
anatofuz
parents:
diff changeset
117
anatofuz
parents:
diff changeset
118 @interface A
anatofuz
parents:
diff changeset
119 - (NSUInteger)foo;
anatofuz
parents:
diff changeset
120 @end
anatofuz
parents:
diff changeset
121
anatofuz
parents:
diff changeset
122 NSUInteger f8(A* x){
anatofuz
parents:
diff changeset
123 const NSUInteger n = [x foo];
anatofuz
parents:
diff changeset
124 int* bogus;
anatofuz
parents:
diff changeset
125
anatofuz
parents:
diff changeset
126 if (n > 0) { // tests const cast transfer function logic
anatofuz
parents:
diff changeset
127 NSUInteger i;
anatofuz
parents:
diff changeset
128
anatofuz
parents:
diff changeset
129 for (i = 0; i < n; ++i)
anatofuz
parents:
diff changeset
130 bogus = 0;
anatofuz
parents:
diff changeset
131
anatofuz
parents:
diff changeset
132 if (bogus) // no-warning
anatofuz
parents:
diff changeset
133 return n+1;
anatofuz
parents:
diff changeset
134 }
anatofuz
parents:
diff changeset
135
anatofuz
parents:
diff changeset
136 return n;
anatofuz
parents:
diff changeset
137 }
anatofuz
parents:
diff changeset
138
anatofuz
parents:
diff changeset
139
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141
anatofuz
parents:
diff changeset
142 typedef struct {
anatofuz
parents:
diff changeset
143 float x;
anatofuz
parents:
diff changeset
144 float y;
anatofuz
parents:
diff changeset
145 float z;
anatofuz
parents:
diff changeset
146 } Point;
anatofuz
parents:
diff changeset
147 typedef struct {
anatofuz
parents:
diff changeset
148 Point origin;
anatofuz
parents:
diff changeset
149 int size;
anatofuz
parents:
diff changeset
150 } Circle;
anatofuz
parents:
diff changeset
151
anatofuz
parents:
diff changeset
152 Point makePoint(float x, float y) {
anatofuz
parents:
diff changeset
153 Point result;
anatofuz
parents:
diff changeset
154 result.x = x;
anatofuz
parents:
diff changeset
155 result.y = y;
anatofuz
parents:
diff changeset
156 result.z = 0.0;
anatofuz
parents:
diff changeset
157 return result;
anatofuz
parents:
diff changeset
158 }
anatofuz
parents:
diff changeset
159
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
160 void PR14765_test(void) {
150
anatofuz
parents:
diff changeset
161 Circle *testObj = calloc(sizeof(Circle), 1);
anatofuz
parents:
diff changeset
162
anatofuz
parents:
diff changeset
163 clang_analyzer_eval(testObj->size == 0); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
164 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
165
anatofuz
parents:
diff changeset
166 testObj->origin = makePoint(0.0, 0.0);
anatofuz
parents:
diff changeset
167 if (testObj->size > 0) { ; } // expected-note{{Assuming field 'size' is <= 0}}
anatofuz
parents:
diff changeset
168 // expected-note@-1{{Taking false branch}}
anatofuz
parents:
diff changeset
169
anatofuz
parents:
diff changeset
170 // FIXME: Assigning to 'testObj->origin' kills the default binding for the
anatofuz
parents:
diff changeset
171 // whole region, meaning that we've forgotten that testObj->size should also
anatofuz
parents:
diff changeset
172 // default to 0. Tracked by <rdar://problem/12701038>.
anatofuz
parents:
diff changeset
173 // This should be TRUE.
anatofuz
parents:
diff changeset
174 clang_analyzer_eval(testObj->size == 0); // expected-warning{{UNKNOWN}}
anatofuz
parents:
diff changeset
175 // expected-note@-1{{UNKNOWN}}
anatofuz
parents:
diff changeset
176
anatofuz
parents:
diff changeset
177 free(testObj);
anatofuz
parents:
diff changeset
178 }
anatofuz
parents:
diff changeset
179
anatofuz
parents:
diff changeset
180 void PR14765_argument(Circle *testObj) {
anatofuz
parents:
diff changeset
181 int oldSize = testObj->size;
anatofuz
parents:
diff changeset
182 clang_analyzer_eval(testObj->size == oldSize); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
183 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
184
anatofuz
parents:
diff changeset
185 testObj->origin = makePoint(0.0, 0.0);
anatofuz
parents:
diff changeset
186 clang_analyzer_eval(testObj->size == oldSize); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
187 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
188 }
anatofuz
parents:
diff changeset
189
anatofuz
parents:
diff changeset
190
anatofuz
parents:
diff changeset
191 typedef struct {
anatofuz
parents:
diff changeset
192 int x;
anatofuz
parents:
diff changeset
193 int y;
anatofuz
parents:
diff changeset
194 int z;
anatofuz
parents:
diff changeset
195 } IntPoint;
anatofuz
parents:
diff changeset
196 typedef struct {
anatofuz
parents:
diff changeset
197 IntPoint origin;
anatofuz
parents:
diff changeset
198 int size;
anatofuz
parents:
diff changeset
199 } IntCircle;
anatofuz
parents:
diff changeset
200
anatofuz
parents:
diff changeset
201 IntPoint makeIntPoint(int x, int y) {
anatofuz
parents:
diff changeset
202 IntPoint result;
anatofuz
parents:
diff changeset
203 result.x = x;
anatofuz
parents:
diff changeset
204 result.y = y;
anatofuz
parents:
diff changeset
205 result.z = 0;
anatofuz
parents:
diff changeset
206 return result;
anatofuz
parents:
diff changeset
207 }
anatofuz
parents:
diff changeset
208
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
209 void PR14765_test_int(void) {
150
anatofuz
parents:
diff changeset
210 IntCircle *testObj = calloc(sizeof(IntCircle), 1);
anatofuz
parents:
diff changeset
211
anatofuz
parents:
diff changeset
212 clang_analyzer_eval(testObj->size == 0); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
213 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
214 clang_analyzer_eval(testObj->origin.x == 0); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
215 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
216 clang_analyzer_eval(testObj->origin.y == 0); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
217 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
218 clang_analyzer_eval(testObj->origin.z == 0); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
219 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
220
anatofuz
parents:
diff changeset
221 testObj->origin = makeIntPoint(1, 2);
anatofuz
parents:
diff changeset
222 if (testObj->size > 0) { ; } // expected-note{{Assuming field 'size' is <= 0}}
anatofuz
parents:
diff changeset
223 // expected-note@-1{{Taking false branch}}
anatofuz
parents:
diff changeset
224 // expected-note@-2{{Assuming field 'size' is <= 0}}
anatofuz
parents:
diff changeset
225 // expected-note@-3{{Taking false branch}}
anatofuz
parents:
diff changeset
226 // expected-note@-4{{Assuming field 'size' is <= 0}}
anatofuz
parents:
diff changeset
227 // expected-note@-5{{Taking false branch}}
anatofuz
parents:
diff changeset
228 // expected-note@-6{{Assuming field 'size' is <= 0}}
anatofuz
parents:
diff changeset
229 // expected-note@-7{{Taking false branch}}
anatofuz
parents:
diff changeset
230
anatofuz
parents:
diff changeset
231 // FIXME: Assigning to 'testObj->origin' kills the default binding for the
anatofuz
parents:
diff changeset
232 // whole region, meaning that we've forgotten that testObj->size should also
anatofuz
parents:
diff changeset
233 // default to 0. Tracked by <rdar://problem/12701038>.
anatofuz
parents:
diff changeset
234 // This should be TRUE.
anatofuz
parents:
diff changeset
235 clang_analyzer_eval(testObj->size == 0); // expected-warning{{UNKNOWN}}
anatofuz
parents:
diff changeset
236 // expected-note@-1{{UNKNOWN}}
anatofuz
parents:
diff changeset
237 clang_analyzer_eval(testObj->origin.x == 1); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
238 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
239 clang_analyzer_eval(testObj->origin.y == 2); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
240 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
241 clang_analyzer_eval(testObj->origin.z == 0); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
242 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
243
anatofuz
parents:
diff changeset
244 free(testObj);
anatofuz
parents:
diff changeset
245 }
anatofuz
parents:
diff changeset
246
anatofuz
parents:
diff changeset
247 void PR14765_argument_int(IntCircle *testObj) {
anatofuz
parents:
diff changeset
248 int oldSize = testObj->size;
anatofuz
parents:
diff changeset
249 clang_analyzer_eval(testObj->size == oldSize); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
250 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
251
anatofuz
parents:
diff changeset
252 testObj->origin = makeIntPoint(1, 2);
anatofuz
parents:
diff changeset
253 clang_analyzer_eval(testObj->size == oldSize); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
254 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
255 clang_analyzer_eval(testObj->origin.x == 1); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
256 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
257 clang_analyzer_eval(testObj->origin.y == 2); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
258 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
259 clang_analyzer_eval(testObj->origin.z == 0); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
260 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
261 }
anatofuz
parents:
diff changeset
262
anatofuz
parents:
diff changeset
263
anatofuz
parents:
diff changeset
264 void rdar13292559(Circle input) {
anatofuz
parents:
diff changeset
265 extern void useCircle(Circle);
anatofuz
parents:
diff changeset
266
anatofuz
parents:
diff changeset
267 Circle obj = input;
anatofuz
parents:
diff changeset
268 useCircle(obj); // no-warning
anatofuz
parents:
diff changeset
269
anatofuz
parents:
diff changeset
270 // This generated an "uninitialized 'size' field" warning for a (short) while.
anatofuz
parents:
diff changeset
271 obj.origin = makePoint(0.0, 0.0);
anatofuz
parents:
diff changeset
272 useCircle(obj); // no-warning
anatofuz
parents:
diff changeset
273 }
anatofuz
parents:
diff changeset
274
anatofuz
parents:
diff changeset
275
anatofuz
parents:
diff changeset
276 typedef struct {
anatofuz
parents:
diff changeset
277 int x;
anatofuz
parents:
diff changeset
278 int y;
anatofuz
parents:
diff changeset
279 } IntPoint2D;
anatofuz
parents:
diff changeset
280 typedef struct {
anatofuz
parents:
diff changeset
281 IntPoint2D origin;
anatofuz
parents:
diff changeset
282 int size;
anatofuz
parents:
diff changeset
283 } IntCircle2D;
anatofuz
parents:
diff changeset
284
anatofuz
parents:
diff changeset
285 IntPoint2D makeIntPoint2D(int x, int y) {
anatofuz
parents:
diff changeset
286 IntPoint2D result;
anatofuz
parents:
diff changeset
287 result.x = x;
anatofuz
parents:
diff changeset
288 result.y = y;
anatofuz
parents:
diff changeset
289 return result;
anatofuz
parents:
diff changeset
290 }
anatofuz
parents:
diff changeset
291
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
292 void testSmallStructsCopiedPerField(void) {
150
anatofuz
parents:
diff changeset
293 IntPoint2D a;
anatofuz
parents:
diff changeset
294 a.x = 0;
anatofuz
parents:
diff changeset
295
anatofuz
parents:
diff changeset
296 IntPoint2D b = a;
anatofuz
parents:
diff changeset
297 extern void useInt(int);
anatofuz
parents:
diff changeset
298 useInt(b.x); // no-warning
anatofuz
parents:
diff changeset
299 useInt(b.y); // expected-warning{{uninitialized}}
anatofuz
parents:
diff changeset
300 // expected-note@-1{{uninitialized}}
anatofuz
parents:
diff changeset
301 }
anatofuz
parents:
diff changeset
302
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
303 void testLargeStructsNotCopiedPerField(void) {
150
anatofuz
parents:
diff changeset
304 IntPoint a;
anatofuz
parents:
diff changeset
305 a.x = 0;
anatofuz
parents:
diff changeset
306
anatofuz
parents:
diff changeset
307 IntPoint b = a;
anatofuz
parents:
diff changeset
308 extern void useInt(int);
anatofuz
parents:
diff changeset
309 useInt(b.x); // no-warning
anatofuz
parents:
diff changeset
310 useInt(b.y); // no-warning
anatofuz
parents:
diff changeset
311 }
anatofuz
parents:
diff changeset
312
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
313 void testSmallStructInLargerStruct(void) {
150
anatofuz
parents:
diff changeset
314 IntCircle2D *testObj = calloc(sizeof(IntCircle2D), 1);
anatofuz
parents:
diff changeset
315
anatofuz
parents:
diff changeset
316 clang_analyzer_eval(testObj->size == 0); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
317 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
318 clang_analyzer_eval(testObj->origin.x == 0); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
319 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
320 clang_analyzer_eval(testObj->origin.y == 0); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
321 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
322
anatofuz
parents:
diff changeset
323 testObj->origin = makeIntPoint2D(1, 2);
anatofuz
parents:
diff changeset
324 if (testObj->size > 0) { ; } // expected-note{{Field 'size' is <= 0}}
anatofuz
parents:
diff changeset
325 // expected-note@-1{{Taking false branch}}
anatofuz
parents:
diff changeset
326 // expected-note@-2{{Field 'size' is <= 0}}
anatofuz
parents:
diff changeset
327 // expected-note@-3{{Taking false branch}}
anatofuz
parents:
diff changeset
328 // expected-note@-4{{Field 'size' is <= 0}}
anatofuz
parents:
diff changeset
329 // expected-note@-5{{Taking false branch}}
anatofuz
parents:
diff changeset
330
anatofuz
parents:
diff changeset
331 clang_analyzer_eval(testObj->size == 0); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
332 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
333 clang_analyzer_eval(testObj->origin.x == 1); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
334 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
335 clang_analyzer_eval(testObj->origin.y == 2); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
336 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
337
anatofuz
parents:
diff changeset
338 free(testObj);
anatofuz
parents:
diff changeset
339 }
anatofuz
parents:
diff changeset
340
anatofuz
parents:
diff changeset
341 void testCopySmallStructIntoArgument(IntCircle2D *testObj) {
anatofuz
parents:
diff changeset
342 int oldSize = testObj->size;
anatofuz
parents:
diff changeset
343 clang_analyzer_eval(testObj->size == oldSize); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
344 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
345
anatofuz
parents:
diff changeset
346 testObj->origin = makeIntPoint2D(1, 2);
anatofuz
parents:
diff changeset
347 clang_analyzer_eval(testObj->size == oldSize); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
348 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
349 clang_analyzer_eval(testObj->origin.x == 1); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
350 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
351 clang_analyzer_eval(testObj->origin.y == 2); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
352 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
353 }
anatofuz
parents:
diff changeset
354
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
355 void testSmallStructBitfields(void) {
150
anatofuz
parents:
diff changeset
356 struct {
anatofuz
parents:
diff changeset
357 int x : 4;
anatofuz
parents:
diff changeset
358 int y : 4;
anatofuz
parents:
diff changeset
359 } a, b;
anatofuz
parents:
diff changeset
360
anatofuz
parents:
diff changeset
361 a.x = 1;
anatofuz
parents:
diff changeset
362 a.y = 2;
anatofuz
parents:
diff changeset
363
anatofuz
parents:
diff changeset
364 b = a;
anatofuz
parents:
diff changeset
365 clang_analyzer_eval(b.x == 1); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
366 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
367 clang_analyzer_eval(b.y == 2); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
368 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
369 }
anatofuz
parents:
diff changeset
370
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
371 void testSmallStructBitfieldsFirstUndef(void) {
150
anatofuz
parents:
diff changeset
372 struct {
anatofuz
parents:
diff changeset
373 int x : 4;
anatofuz
parents:
diff changeset
374 int y : 4;
anatofuz
parents:
diff changeset
375 } a, b;
anatofuz
parents:
diff changeset
376
anatofuz
parents:
diff changeset
377 a.y = 2;
anatofuz
parents:
diff changeset
378
anatofuz
parents:
diff changeset
379 b = a;
anatofuz
parents:
diff changeset
380 clang_analyzer_eval(b.y == 2); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
381 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
382 clang_analyzer_eval(b.x == 1); // expected-warning{{garbage}}
anatofuz
parents:
diff changeset
383 // expected-note@-1{{garbage}}
anatofuz
parents:
diff changeset
384 }
anatofuz
parents:
diff changeset
385
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
386 void testSmallStructBitfieldsSecondUndef(void) {
150
anatofuz
parents:
diff changeset
387 struct {
anatofuz
parents:
diff changeset
388 int x : 4;
anatofuz
parents:
diff changeset
389 int y : 4;
anatofuz
parents:
diff changeset
390 } a, b;
anatofuz
parents:
diff changeset
391
anatofuz
parents:
diff changeset
392 a.x = 1;
anatofuz
parents:
diff changeset
393
anatofuz
parents:
diff changeset
394 b = a;
anatofuz
parents:
diff changeset
395 clang_analyzer_eval(b.x == 1); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
396 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
397 clang_analyzer_eval(b.y == 2); // expected-warning{{garbage}}
anatofuz
parents:
diff changeset
398 // expected-note@-1{{garbage}}
anatofuz
parents:
diff changeset
399 }
anatofuz
parents:
diff changeset
400
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
401 void testSmallStructBitfieldsFirstUnnamed(void) {
150
anatofuz
parents:
diff changeset
402 struct {
anatofuz
parents:
diff changeset
403 int : 4;
anatofuz
parents:
diff changeset
404 int y : 4;
anatofuz
parents:
diff changeset
405 } a, b, c; // expected-note{{'c' initialized here}}
anatofuz
parents:
diff changeset
406
anatofuz
parents:
diff changeset
407 a.y = 2;
anatofuz
parents:
diff changeset
408
anatofuz
parents:
diff changeset
409 b = a;
anatofuz
parents:
diff changeset
410 clang_analyzer_eval(b.y == 2); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
411 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
412
anatofuz
parents:
diff changeset
413 b = c; // expected-note{{Uninitialized value stored to 'b.y'}}
anatofuz
parents:
diff changeset
414 clang_analyzer_eval(b.y == 2); // expected-warning{{garbage}}
anatofuz
parents:
diff changeset
415 // expected-note@-1{{garbage}}
anatofuz
parents:
diff changeset
416 }
anatofuz
parents:
diff changeset
417
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
418 void testSmallStructBitfieldsSecondUnnamed(void) {
150
anatofuz
parents:
diff changeset
419 struct {
anatofuz
parents:
diff changeset
420 int x : 4;
anatofuz
parents:
diff changeset
421 int : 4;
anatofuz
parents:
diff changeset
422 } a, b, c; // expected-note{{'c' initialized here}}
anatofuz
parents:
diff changeset
423
anatofuz
parents:
diff changeset
424 a.x = 1;
anatofuz
parents:
diff changeset
425
anatofuz
parents:
diff changeset
426 b = a;
anatofuz
parents:
diff changeset
427 clang_analyzer_eval(b.x == 1); // expected-warning{{TRUE}}
anatofuz
parents:
diff changeset
428 // expected-note@-1{{TRUE}}
anatofuz
parents:
diff changeset
429
anatofuz
parents:
diff changeset
430 b = c; // expected-note{{Uninitialized value stored to 'b.x'}}
anatofuz
parents:
diff changeset
431 clang_analyzer_eval(b.x == 1); // expected-warning{{garbage}}
anatofuz
parents:
diff changeset
432 // expected-note@-1{{garbage}}
anatofuz
parents:
diff changeset
433 }