cfg.cpp revision 1ae74842cd1be37a8d99d0865623ef16432d3b67
1// RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpCFG -triple x86_64-apple-darwin12 -std=c++11 %s 2>&1 | FileCheck %s 2 3// CHECK: ENTRY 4// CHECK-NEXT: Succs (1): B1 5// CHECK: [B1] 6// CHECK: Succs (21): B2 B3 B4 B5 B6 B7 B8 B9 7// CHECK: B10 B11 B12 B13 B14 B15 B16 B17 B18 B19 8// CHECK: B20 B21 B0 9// CHECK: [B0 (EXIT)] 10// CHECK-NEXT: Preds (21): B2 B3 B4 B5 B6 B7 B8 B9 11// CHECK-NEXT: B10 B11 B12 B13 B14 B15 B16 B17 B18 B19 12// CHECK-NEXT: B20 B21 B1 13void checkWrap(int i) { 14 switch(i) { 15 case 0: break; 16 case 1: break; 17 case 2: break; 18 case 3: break; 19 case 4: break; 20 case 5: break; 21 case 6: break; 22 case 7: break; 23 case 8: break; 24 case 9: break; 25 case 10: break; 26 case 11: break; 27 case 12: break; 28 case 13: break; 29 case 14: break; 30 case 15: break; 31 case 16: break; 32 case 17: break; 33 case 18: break; 34 case 19: break; 35 } 36} 37 38// CHECK: ENTRY 39// CHECK-NEXT: Succs (1): B1 40// CHECK: [B1] 41// CHECK-NEXT: 1: int i; 42// CHECK-NEXT: 2: int j; 43// CHECK-NEXT: 3: 1 44// CHECK-NEXT: 4: int k = 1; 45// CHECK-NEXT: 5: int l; 46// CHECK-NEXT: 6: 2 47// CHECK-NEXT: 7: int m = 2; 48// CHECK-NEXT: CXXConstructExpr 49// CHECK-NEXT: 9: struct standalone myStandalone; 50// CHECK-NEXT: CXXConstructExpr 51// CHECK-NEXT: 11: struct <anonymous struct at {{.*}}> myAnon; 52// CHECK-NEXT: CXXConstructExpr 53// CHECK-NEXT: 13: struct named myNamed; 54// CHECK-NEXT: Preds (1): B2 55// CHECK-NEXT: Succs (1): B0 56void checkDeclStmts() { 57 int i, j; 58 int k = 1, l, m = 2; 59 60 struct standalone { int x, y; }; 61 struct standalone myStandalone; 62 63 struct { int x, y; } myAnon; 64 65 struct named { int x, y; } myNamed; 66 67 static_assert(1, "abc"); 68} 69 70// CHECK: ENTRY 71// CHECK-NEXT: Succs (1): B1 72// CHECK: [B1] 73// CHECK-NEXT: 1: e 74// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, enum EmptyE) 75// CHECK-NEXT: 3: [B1.2] (ImplicitCastExpr, IntegralCast, int) 76// CHECK-NEXT: T: switch [B1.3] 77// CHECK-NEXT: Preds (1): B2 78// CHECK-NEXT: Succs (1): B0 79// CHECK: [B0 (EXIT)] 80// CHECK-NEXT: Preds (1): B1 81enum EmptyE {}; 82void F(EmptyE e) { 83 switch (e) {} 84} 85 86// CHECK: ENTRY 87// CHECK-NEXT: Succs (1): B1 88// CHECK: [B1] 89// CHECK-NEXT: 1: __builtin_object_size 90// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, BuiltinFnToFnPtr, unsigned long (*)(const void *, int)) 91// CHECK-NEXT: 3: [B1.2](dummy(), 0) 92// CHECK-NEXT: 4: (void)[B1.3] (CStyleCastExpr, ToVoid, void) 93// CHECK-NEXT: Preds (1): B2 94// CHECK-NEXT: Succs (1): B0 95// CHECK: [B0 (EXIT)] 96// CHECK-NEXT: Preds (1): B1 97void testBuiltinSize() { 98 extern int *dummy(); 99 (void)__builtin_object_size(dummy(), 0); 100} 101 102 103class A { 104public: 105 A() {} 106 ~A() {} 107}; 108 109// CHECK: [B2 (ENTRY)] 110// CHECK-NEXT: Succs (1): B1 111// CHECK: [B1] 112// CHECK-NEXT: 1: (CXXConstructExpr, class A) 113// CHECK-NEXT: 2: new A([B1.1]) 114// CHECK-NEXT: 3: A *a = new A(); 115// CHECK-NEXT: 4: a 116// CHECK-NEXT: 5: [B1.4] (ImplicitCastExpr, LValueToRValue, class A *) 117// CHECK-NEXT: 6: [B1.5]->~A() (Implicit destructor) 118// CHECK-NEXT: 7: delete [B1.5] 119// CHECK-NEXT: Preds (1): B2 120// CHECK-NEXT: Succs (1): B0 121// CHECK: [B0 (EXIT)] 122// CHECK-NEXT: Preds (1): B1 123void test_deletedtor() { 124 A *a = new A(); 125 delete a; 126} 127 128// CHECK: [B2 (ENTRY)] 129// CHECK-NEXT: Succs (1): B1 130// CHECK: [B1] 131// CHECK-NEXT: 1: 5 132// CHECK-NEXT: 2: (CXXConstructExpr, class A) 133// CHECK-NEXT: 3: new A {{\[\[}}B1.1]] 134// CHECK-NEXT: 4: A *a = new A [5]; 135// CHECK-NEXT: 5: a 136// CHECK-NEXT: 6: [B1.5] (ImplicitCastExpr, LValueToRValue, class A *) 137// CHECK-NEXT: 7: [B1.6]->~A() (Implicit destructor) 138// CHECK-NEXT: 8: delete [] [B1.6] 139// CHECK-NEXT: Preds (1): B2 140// CHECK-NEXT: Succs (1): B0 141// CHECK: [B0 (EXIT)] 142// CHECK-NEXT: Preds (1): B1 143void test_deleteArraydtor() { 144 A *a = new A[5]; 145 delete[] a; 146} 147 148 149namespace NoReturnSingleSuccessor { 150 struct A { 151 A(); 152 ~A(); 153 }; 154 155 struct B : public A { 156 B(); 157 ~B() __attribute__((noreturn)); 158 }; 159 160// CHECK: ENTRY 161// CHECK: 1: 1 162// CHECK-NEXT: 2: return 163// CHECK-NEXT: ~B() (Implicit destructor) 164// CHECK-NEXT: Preds (1) 165// CHECK-NEXT: Succs (1): B0 166 int test1(int *x) { 167 B b; 168 if (x) 169 return 1; 170 } 171 172// CHECK: ENTRY 173// CHECK: 1: 1 174// CHECK-NEXT: 2: return 175// CHECK-NEXT: destructor 176// CHECK-NEXT: Preds (1) 177// CHECK-NEXT: Succs (1): B0 178 int test2(int *x) { 179 const A& a = B(); 180 if (x) 181 return 1; 182 } 183} 184