blob: 40bc3138b66ba30a99441b4bbdbc1465e533fe02 [file] [log] [blame]
Ted Kremenek5d0fb1e2013-12-11 23:44:05 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpCFG -triple x86_64-apple-darwin12 -std=c++11 %s > %t 2>&1
2// RUN: FileCheck --input-file=%t %s
Will Dietzdf9a2bb2013-01-07 09:51:17 +00003
4// CHECK: ENTRY
5// CHECK-NEXT: Succs (1): B1
6// CHECK: [B1]
7// CHECK: Succs (21): B2 B3 B4 B5 B6 B7 B8 B9
8// CHECK: B10 B11 B12 B13 B14 B15 B16 B17 B18 B19
9// CHECK: B20 B21 B0
10// CHECK: [B0 (EXIT)]
11// CHECK-NEXT: Preds (21): B2 B3 B4 B5 B6 B7 B8 B9
12// CHECK-NEXT: B10 B11 B12 B13 B14 B15 B16 B17 B18 B19
13// CHECK-NEXT: B20 B21 B1
Jordan Rose5250b872013-06-03 22:59:41 +000014void checkWrap(int i) {
Will Dietzdf9a2bb2013-01-07 09:51:17 +000015 switch(i) {
16 case 0: break;
17 case 1: break;
18 case 2: break;
19 case 3: break;
20 case 4: break;
21 case 5: break;
22 case 6: break;
23 case 7: break;
24 case 8: break;
25 case 9: break;
26 case 10: break;
27 case 11: break;
28 case 12: break;
29 case 13: break;
30 case 14: break;
31 case 15: break;
32 case 16: break;
33 case 17: break;
34 case 18: break;
35 case 19: break;
36 }
37}
Jordan Rose5250b872013-06-03 22:59:41 +000038
39// CHECK: ENTRY
40// CHECK-NEXT: Succs (1): B1
41// CHECK: [B1]
42// CHECK-NEXT: 1: int i;
43// CHECK-NEXT: 2: int j;
44// CHECK-NEXT: 3: 1
45// CHECK-NEXT: 4: int k = 1;
46// CHECK-NEXT: 5: int l;
47// CHECK-NEXT: 6: 2
48// CHECK-NEXT: 7: int m = 2;
49// CHECK-NEXT: CXXConstructExpr
50// CHECK-NEXT: 9: struct standalone myStandalone;
51// CHECK-NEXT: CXXConstructExpr
52// CHECK-NEXT: 11: struct <anonymous struct at {{.*}}> myAnon;
53// CHECK-NEXT: CXXConstructExpr
54// CHECK-NEXT: 13: struct named myNamed;
55// CHECK-NEXT: Preds (1): B2
56// CHECK-NEXT: Succs (1): B0
57void checkDeclStmts() {
58 int i, j;
59 int k = 1, l, m = 2;
60
61 struct standalone { int x, y; };
62 struct standalone myStandalone;
63
64 struct { int x, y; } myAnon;
65
66 struct named { int x, y; } myNamed;
67
68 static_assert(1, "abc");
69}
David Majnemerf69ce862013-06-04 17:38:44 +000070
71// CHECK: ENTRY
72// CHECK-NEXT: Succs (1): B1
73// CHECK: [B1]
74// CHECK-NEXT: 1: e
75// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, enum EmptyE)
76// CHECK-NEXT: 3: [B1.2] (ImplicitCastExpr, IntegralCast, int)
77// CHECK-NEXT: T: switch [B1.3]
78// CHECK-NEXT: Preds (1): B2
79// CHECK-NEXT: Succs (1): B0
80// CHECK: [B0 (EXIT)]
81// CHECK-NEXT: Preds (1): B1
82enum EmptyE {};
83void F(EmptyE e) {
84 switch (e) {}
85}
Jordan Rose5374c072013-08-19 16:27:28 +000086
87// CHECK: ENTRY
88// CHECK-NEXT: Succs (1): B1
89// CHECK: [B1]
90// CHECK-NEXT: 1: __builtin_object_size
91// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, BuiltinFnToFnPtr, unsigned long (*)(const void *, int))
92// CHECK-NEXT: 3: [B1.2](dummy(), 0)
93// CHECK-NEXT: 4: (void)[B1.3] (CStyleCastExpr, ToVoid, void)
94// CHECK-NEXT: Preds (1): B2
95// CHECK-NEXT: Succs (1): B0
96// CHECK: [B0 (EXIT)]
97// CHECK-NEXT: Preds (1): B1
98void testBuiltinSize() {
99 extern int *dummy();
100 (void)__builtin_object_size(dummy(), 0);
101}
Jordan Rosed2f40792013-09-03 17:00:57 +0000102
103
104class A {
105public:
106 A() {}
107 ~A() {}
108};
109
110// CHECK: [B2 (ENTRY)]
111// CHECK-NEXT: Succs (1): B1
112// CHECK: [B1]
Jordan Rosec9176072014-01-13 17:59:19 +0000113// CHECK-NEXT: 1: CFGNewAllocator(A *)
114// CHECK-NEXT: 2: (CXXConstructExpr, class A)
115// CHECK-NEXT: 3: new A([B1.2])
116// CHECK-NEXT: 4: A *a = new A();
117// CHECK-NEXT: 5: a
118// CHECK-NEXT: 6: [B1.5] (ImplicitCastExpr, LValueToRValue, class A *)
119// CHECK-NEXT: 7: [B1.6]->~A() (Implicit destructor)
120// CHECK-NEXT: 8: delete [B1.6]
Jordan Rosed2f40792013-09-03 17:00:57 +0000121// CHECK-NEXT: Preds (1): B2
122// CHECK-NEXT: Succs (1): B0
123// CHECK: [B0 (EXIT)]
124// CHECK-NEXT: Preds (1): B1
125void test_deletedtor() {
126 A *a = new A();
127 delete a;
128}
129
130// CHECK: [B2 (ENTRY)]
131// CHECK-NEXT: Succs (1): B1
132// CHECK: [B1]
133// CHECK-NEXT: 1: 5
Jordan Rosec9176072014-01-13 17:59:19 +0000134// CHECK-NEXT: 2: CFGNewAllocator(A *)
135// CHECK-NEXT: 3: (CXXConstructExpr, class A)
136// CHECK-NEXT: 4: new A {{\[\[}}B1.1]]
137// CHECK-NEXT: 5: A *a = new A [5];
138// CHECK-NEXT: 6: a
139// CHECK-NEXT: 7: [B1.6] (ImplicitCastExpr, LValueToRValue, class A *)
140// CHECK-NEXT: 8: [B1.7]->~A() (Implicit destructor)
141// CHECK-NEXT: 9: delete [] [B1.7]
Jordan Rosed2f40792013-09-03 17:00:57 +0000142// CHECK-NEXT: Preds (1): B2
143// CHECK-NEXT: Succs (1): B0
144// CHECK: [B0 (EXIT)]
145// CHECK-NEXT: Preds (1): B1
146void test_deleteArraydtor() {
147 A *a = new A[5];
148 delete[] a;
149}
Pavel Labath921e7652013-09-06 08:12:48 +0000150
151
152namespace NoReturnSingleSuccessor {
153 struct A {
154 A();
155 ~A();
156 };
157
158 struct B : public A {
159 B();
160 ~B() __attribute__((noreturn));
161 };
162
163// CHECK: ENTRY
164// CHECK: 1: 1
165// CHECK-NEXT: 2: return
166// CHECK-NEXT: ~B() (Implicit destructor)
167// CHECK-NEXT: Preds (1)
168// CHECK-NEXT: Succs (1): B0
169 int test1(int *x) {
170 B b;
171 if (x)
172 return 1;
173 }
174
175// CHECK: ENTRY
176// CHECK: 1: 1
177// CHECK-NEXT: 2: return
178// CHECK-NEXT: destructor
179// CHECK-NEXT: Preds (1)
180// CHECK-NEXT: Succs (1): B0
181 int test2(int *x) {
182 const A& a = B();
183 if (x)
184 return 1;
185 }
186}
Ted Kremenek5d0fb1e2013-12-11 23:44:05 +0000187
188// Test CFG support for "extending" an enum.
189// CHECK: [B7 (ENTRY)]
190// CHECK-NEXT: Succs (1): B2
191// CHECK: [B1]
192// CHECK-NEXT: 1: x
193// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, int)
194// CHECK-NEXT: 3: return [B1.2];
195// CHECK-NEXT: Preds (4): B3 B4 B5 B6
196// CHECK-NEXT: Succs (1): B0
197// CHECK: [B2]
198// CHECK-NEXT: 1: 0
199// CHECK-NEXT: 2: int x = 0;
200// CHECK-NEXT: 3: value
201// CHECK-NEXT: 4: [B2.3] (ImplicitCastExpr, LValueToRValue, enum MyEnum)
202// CHECK-NEXT: 5: [B2.4] (ImplicitCastExpr, IntegralCast, int)
203// CHECK-NEXT: T: switch [B2.5]
204// CHECK-NEXT: Preds (1): B7
205// CHECK-NEXT: Succs (5): B3 B4 B5 B6 NULL
206// CHECK: [B3]
207// CHECK-NEXT: case D:
208// CHECK-NEXT: 1: 4
209// CHECK-NEXT: 2: x
210// CHECK-NEXT: 3: [B3.2] = [B3.1]
211// CHECK-NEXT: T: break;
212// CHECK-NEXT: Preds (1): B2
213// CHECK-NEXT: Succs (1): B1
214// CHECK: [B4]
215// CHECK-NEXT: case C:
216// CHECK-NEXT: 1: 3
217// CHECK-NEXT: 2: x
218// CHECK-NEXT: 3: [B4.2] = [B4.1]
219// CHECK-NEXT: T: break;
220// CHECK-NEXT: Preds (1): B2
221// CHECK-NEXT: Succs (1): B1
222// CHECK: [B5]
223// CHECK-NEXT: case B:
224// CHECK-NEXT: 1: 2
225// CHECK-NEXT: 2: x
226// CHECK-NEXT: 3: [B5.2] = [B5.1]
227// CHECK-NEXT: T: break;
228// CHECK-NEXT: Preds (1): B2
229// CHECK-NEXT: Succs (1): B1
230// CHECK: [B6]
231// CHECK-NEXT: case A:
232// CHECK-NEXT: 1: 1
233// CHECK-NEXT: 2: x
234// CHECK-NEXT: 3: [B6.2] = [B6.1]
235// CHECK-NEXT: T: break;
236// CHECK-NEXT: Preds (1): B2
237// CHECK-NEXT: Succs (1): B1
238// CHECK: [B0 (EXIT)]
239// CHECK-NEXT: Preds (1): B1
240enum MyEnum { A, B, C };
241static const enum MyEnum D = (enum MyEnum) 32;
242
243int test_enum_with_extension(enum MyEnum value) {
244 int x = 0;
245 switch (value) {
246 case A: x = 1; break;
247 case B: x = 2; break;
248 case C: x = 3; break;
249 case D: x = 4; break;
250 }
251 return x;
252}
253
254// CHECK: [B7 (ENTRY)]
255// CHECK-NEXT: Succs (1): B2
256// CHECK: [B1]
257// CHECK-NEXT: 1: x
258// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, int)
259// CHECK-NEXT: 3: return [B1.2];
260// CHECK-NEXT: Preds (4): B3 B4 B5 B6
261// CHECK-NEXT: Succs (1): B0
262// CHECK: [B2]
263// CHECK-NEXT: 1: 0
264// CHECK-NEXT: 2: int x = 0;
265// CHECK-NEXT: 3: value
266// CHECK-NEXT: 4: [B2.3] (ImplicitCastExpr, LValueToRValue, enum MyEnum)
267// CHECK-NEXT: 5: [B2.4] (ImplicitCastExpr, IntegralCast, int)
268// CHECK-NEXT: T: switch [B2.5]
269// CHECK-NEXT: Preds (1): B7
270// CHECK-NEXT: Succs (4): B4 B5 B6 NULL
271// CHECK: [B3]
272// CHECK-NEXT: default:
273// CHECK-NEXT: 1: 4
274// CHECK-NEXT: 2: x
275// CHECK-NEXT: 3: [B3.2] = [B3.1]
276// CHECK-NEXT: T: break;
277// CHECK-NEXT: Succs (1): B1
278// CHECK: [B4]
279// CHECK-NEXT: case C:
280// CHECK-NEXT: 1: 3
281// CHECK-NEXT: 2: x
282// CHECK-NEXT: 3: [B4.2] = [B4.1]
283// CHECK-NEXT: T: break;
284// CHECK-NEXT: Preds (1): B2
285// CHECK-NEXT: Succs (1): B1
286// CHECK: [B5]
287// CHECK-NEXT: case B:
288// CHECK-NEXT: 1: 2
289// CHECK-NEXT: 2: x
290// CHECK-NEXT: 3: [B5.2] = [B5.1]
291// CHECK-NEXT: T: break;
292// CHECK-NEXT: Preds (1): B2
293// CHECK-NEXT: Succs (1): B1
294// CHECK: [B6]
295// CHECK-NEXT: case A:
296// CHECK-NEXT: 1: 1
297// CHECK-NEXT: 2: x
298// CHECK-NEXT: 3: [B6.2] = [B6.1]
299// CHECK-NEXT: T: break;
300// CHECK-NEXT: Preds (1): B2
301// CHECK-NEXT: Succs (1): B1
302// CHECK: [B0 (EXIT)]
303// CHECK-NEXT: Preds (1): B1
304int test_enum_with_extension_default(enum MyEnum value) {
305 int x = 0;
306 switch (value) {
307 case A: x = 1; break;
308 case B: x = 2; break;
309 case C: x = 3; break;
310 default: x = 4; break;
311 }
312 return x;
Jordan Rosec9176072014-01-13 17:59:19 +0000313}
314
315
316// CHECK: [B1 (ENTRY)]
317// CHECK-NEXT: Succs (1): B0
318// CHECK: [B0 (EXIT)]
319// CHECK-NEXT: Preds (1): B1
320// CHECK: [B1 (ENTRY)]
321// CHECK-NEXT: Succs (1): B0
322// CHECK: [B0 (EXIT)]
323// CHECK-NEXT: Preds (1): B1
324// CHECK: [B2 (ENTRY)]
325// CHECK-NEXT: Succs (1): B1
326// CHECK: [B1]
327// CHECK-NEXT: 1: int buffer[16];
328// CHECK-NEXT: 2: buffer
329// CHECK-NEXT: 3: [B1.2] (ImplicitCastExpr, ArrayToPointerDecay, int *)
330// CHECK-NEXT: 4: [B1.3] (ImplicitCastExpr, BitCast, void *)
331// CHECK-NEXT: 5: CFGNewAllocator(MyClass *)
332// CHECK-NEXT: 6: (CXXConstructExpr, class MyClass)
333// CHECK-NEXT: 7: new ([B1.4]) MyClass([B1.6])
334// CHECK-NEXT: 8: MyClass *obj = new (buffer) MyClass();
335// CHECK-NEXT: Preds (1): B2
336// CHECK-NEXT: Succs (1): B0
337// CHECK: [B0 (EXIT)]
338// CHECK-NEXT: Preds (1): B1
339
340extern void* operator new (unsigned long sz, void* v);
341extern void* operator new[] (unsigned long sz, void* ptr);
342
343class MyClass {
344public:
345 MyClass() {}
346 ~MyClass() {}
347};
348
349void test_placement_new() {
350 int buffer[16];
351 MyClass* obj = new (buffer) MyClass();
352}
353
354// CHECK: [B2 (ENTRY)]
355// CHECK-NEXT: Succs (1): B1
356// CHECK: [B1]
357// CHECK-NEXT: 1: int buffer[16];
358// CHECK-NEXT: 2: buffer
359// CHECK-NEXT: 3: [B1.2] (ImplicitCastExpr, ArrayToPointerDecay, int *)
360// CHECK-NEXT: 4: [B1.3] (ImplicitCastExpr, BitCast, void *)
361// CHECK-NEXT: 5: 5
362// CHECK-NEXT: 6: CFGNewAllocator(MyClass *)
363// CHECK-NEXT: 7: (CXXConstructExpr, class MyClass)
364// CHECK-NEXT: 8: new ([B1.4]) MyClass {{\[\[}}B1.5]]
365// CHECK-NEXT: 9: MyClass *obj = new (buffer) MyClass [5];
366// CHECK-NEXT: Preds (1): B2
367// CHECK-NEXT: Succs (1): B0
368// CHECK: [B0 (EXIT)]
369// CHECK-NEXT: Preds (1): B1
370
371void test_placement_new_array() {
372 int buffer[16];
373 MyClass* obj = new (buffer) MyClass[5];
374}