477 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=debug.DumpCFG -analyzer-config cfg-loopexit=true %s > %t 2>&12// RUN: FileCheck --input-file=%t %s3 4// CHECK: [B6 (ENTRY)]5// CHECK-NEXT: Succs (1): B56 7// CHECK: [B1]8// CHECK-NEXT: 1: ForStmt (LoopExit)9// CHECK-NEXT: 2: return;10// CHECK-NEXT: Preds (1): B411// CHECK-NEXT: Succs (1): B012 13// CHECK: [B2]14// CHECK-NEXT: 1: i15// CHECK-NEXT: 2: [B2.1]++16// CHECK-NEXT: Preds (1): B317// CHECK-NEXT: Succs (1): B418 19// CHECK: [B3]20// CHECK-NEXT: 1: i21// CHECK-NEXT: 2: [B3.1]++22// CHECK-NEXT: Preds (1): B423// CHECK-NEXT: Succs (1): B224 25// CHECK: [B4]26// CHECK-NEXT: 1: i27// CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, LValueToRValue, int)28// CHECK-NEXT: 3: 1229// CHECK-NEXT: 4: [B4.2] < [B4.3]30// CHECK-NEXT: T: for (...; [B4.4]; ...)31// CHECK-NEXT: Preds (2): B2 B532// CHECK-NEXT: Succs (2): B3 B133 34// CHECK: [B5]35// CHECK-NEXT: 1: 036// CHECK-NEXT: 2: int i = 0;37// CHECK-NEXT: Preds (1): B638// CHECK-NEXT: Succs (1): B439 40// CHECK: [B0 (EXIT)]41// CHECK-NEXT: Preds (1): B142void check_forloop1() {43 for (int i = 0; i < 12; i++) {44 i++;45 }46 return;47}48 49// CHECK: [B4 (ENTRY)]50// CHECK-NEXT: Succs (1): B351 52// CHECK: [B1]53// CHECK-NEXT: 1: ForStmt (LoopExit)54// CHECK-NEXT: Succs (1): B055 56// CHECK: [B2]57// CHECK-NEXT: Preds (1): B358// CHECK-NEXT: Succs (1): B359 60// CHECK: [B3]61// CHECK-NEXT: T: for (; ; )62// CHECK-NEXT: Preds (2): B2 B463// CHECK-NEXT: Succs (2): B2 NULL64 65// CHECK: [B0 (EXIT)]66// CHECK-NEXT: Preds (1): B167void check_forloop2() {68 for (;;)69 ;70}71 72// CHECK: [B5 (ENTRY)]73// CHECK-NEXT: Succs (1): B474 75// CHECK: [B1]76// CHECK-NEXT: 1: WhileStmt (LoopExit)77// CHECK-NEXT: Succs (1): B078 79// CHECK: [B2]80// CHECK-NEXT: Preds (1): B381// CHECK-NEXT: Succs (1): B482 83// CHECK: [B3]84// CHECK-NEXT: 1: int i;85// CHECK-NEXT: Preds (1): B486// CHECK-NEXT: Succs (1): B287 88// CHECK: [B4]89// CHECK-NEXT: 1: true90// CHECK-NEXT: T: while [B4.1]91// CHECK-NEXT: Preds (2): B2 B592// CHECK-NEXT: Succs (2): B3 NULL93 94// CHECK: [B0 (EXIT)]95// CHECK-NEXT: Preds (1): B196void check_while1() {97 while (true) {98 int i;99 }100}101 102// CHECK: [B5 (ENTRY)]103// CHECK-NEXT: Succs (1): B4104 105// CHECK: [B1]106// CHECK-NEXT: 1: WhileStmt (LoopExit)107// CHECK-NEXT: 2: 2108// CHECK-NEXT: 3: int k = 2;109// CHECK-NEXT: 4: return;110// CHECK-NEXT: Preds (1): B3111// CHECK-NEXT: Succs (1): B0112 113// CHECK: [B2]114// CHECK-NEXT: Preds (1): B3115// CHECK-NEXT: Succs (1): B3116 117// CHECK: [B3]118// CHECK-NEXT: 1: l119// CHECK-NEXT: 2: [B3.1] (ImplicitCastExpr, LValueToRValue, int)120// CHECK-NEXT: 3: 42121// CHECK-NEXT: 4: [B3.2] < [B3.3]122// CHECK-NEXT: T: while [B3.4]123// CHECK-NEXT: Preds (2): B2 B4124// CHECK-NEXT: Succs (2): B2 B1125 126// CHECK: [B4]127// CHECK-NEXT: 1: int l;128// CHECK-NEXT: Preds (1): B5129// CHECK-NEXT: Succs (1): B3130 131// CHECK: [B0 (EXIT)]132// CHECK-NEXT: Preds (1): B1133void check_while2() {134 int l;135 while (l < 42)136 ;137 int k = 2;138 return;139}140 141// CHECK: [B4 (ENTRY)]142// CHECK-NEXT: Succs (1): B3143 144// CHECK: [B1]145// CHECK-NEXT: 1: WhileStmt (LoopExit)146// CHECK-NEXT: Preds (1): B3147// CHECK-NEXT: Succs (1): B0148 149// CHECK: [B2]150// CHECK-NEXT: Succs (1): B3151 152// CHECK: [B3]153// CHECK-NEXT: 1: false154// CHECK-NEXT: T: while [B3.1]155// CHECK-NEXT: Preds (2): B2 B4156// CHECK-NEXT: Succs (2): NULL B1157 158// CHECK: [B0 (EXIT)]159// CHECK-NEXT: Preds (1): B1160void check_while3() {161 while (false) {162 ;163 }164}165 166// CHECK: [B4 (ENTRY)]167// CHECK-NEXT: Succs (1): B2168 169// CHECK: [B1]170// CHECK-NEXT: 1: DoStmt (LoopExit)171// CHECK-NEXT: Preds (1): B2172// CHECK-NEXT: Succs (1): B0173 174// CHECK: [B2]175// CHECK-NEXT: 1: false176// CHECK-NEXT: T: do ... while [B2.1]177// CHECK-NEXT: Preds (2): B3 B4178// CHECK-NEXT: Succs (2): NULL B1179 180// CHECK: [B3]181// CHECK-NEXT: Succs (1): B2182 183// CHECK: [B0 (EXIT)]184// CHECK-NEXT: Preds (1): B1185void check_dowhile1() {186 do {187 } while (false);188}189 190// CHECK: [B6 (ENTRY)]191// CHECK-NEXT: Succs (1): B5192 193// CHECK: [B1]194// CHECK-NEXT: 1: DoStmt (LoopExit)195// CHECK-NEXT: 2: j196// CHECK-NEXT: 3: [B1.2]--197// CHECK-NEXT: 4: return;198// CHECK-NEXT: Preds (1): B2199// CHECK-NEXT: Succs (1): B0200 201// CHECK: [B2]202// CHECK-NEXT: 1: j203// CHECK-NEXT: 2: [B2.1] (ImplicitCastExpr, LValueToRValue, int)204// CHECK-NEXT: 3: 20205// CHECK-NEXT: 4: [B2.2] < [B2.3]206// CHECK-NEXT: T: do ... while [B2.4]207// CHECK-NEXT: Preds (1): B3208// CHECK-NEXT: Succs (2): B4 B1209 210// CHECK: [B3]211// CHECK-NEXT: 1: j212// CHECK-NEXT: 2: 2213// CHECK-NEXT: 3: [B3.1] += [B3.2]214// CHECK-NEXT: Preds (2): B4 B5215// CHECK-NEXT: Succs (1): B2216 217// CHECK: [B4]218// CHECK-NEXT: Preds (1): B2219// CHECK-NEXT: Succs (1): B3220 221// CHECK: [B5]222// CHECK-NEXT: 1: 2223// CHECK-NEXT: 2: int j = 2;224// CHECK-NEXT: Preds (1): B6225// CHECK-NEXT: Succs (1): B3226 227// CHECK: [B0 (EXIT)]228// CHECK-NEXT: Preds (1): B1229void check_dowhile2() {230 int j = 2;231 do {232 j += 2;233 } while (j < 20);234 j--;235 return;236}237 238// CHECK: [B10 (ENTRY)]239// CHECK-NEXT: Succs (1): B9240 241// CHECK: [B1]242// CHECK-NEXT: 1: WhileStmt (LoopExit)243// CHECK-NEXT: Preds (1): B8244// CHECK-NEXT: Succs (1): B0245 246// CHECK: [B2]247// CHECK-NEXT: Preds (1): B3248// CHECK-NEXT: Succs (1): B8249 250// CHECK: [B3]251// CHECK-NEXT: 1: ForStmt (LoopExit)252// CHECK-NEXT: Preds (1): B6253// CHECK-NEXT: Succs (1): B2254 255// CHECK: [B4]256// CHECK-NEXT: 1: j257// CHECK-NEXT: 2: [B4.1]++258// CHECK-NEXT: Preds (1): B5259// CHECK-NEXT: Succs (1): B6260 261// CHECK: [B5]262// CHECK-NEXT: 1: i263// CHECK-NEXT: 2: [B5.1]++264// CHECK-NEXT: Preds (1): B6265// CHECK-NEXT: Succs (1): B4266 267// CHECK: [B6]268// CHECK-NEXT: 1: j269// CHECK-NEXT: 2: [B6.1] (ImplicitCastExpr, LValueToRValue, int)270// CHECK-NEXT: 3: 6271// CHECK-NEXT: 4: [B6.2] < [B6.3]272// CHECK-NEXT: T: for (...; [B6.4]; ...)273// CHECK-NEXT: Preds (2): B4 B7274// CHECK-NEXT: Succs (2): B5 B3275 276// CHECK: [B7]277// CHECK-NEXT: 1: 1278// CHECK-NEXT: 2: int j = 1;279// CHECK-NEXT: Preds (1): B8280// CHECK-NEXT: Succs (1): B6281 282// CHECK: [B8]283// CHECK-NEXT: 1: i284// CHECK-NEXT: 2: [B8.1] (ImplicitCastExpr, LValueToRValue, int)285// CHECK-NEXT: 3: 2286// CHECK-NEXT: 4: [B8.2] < [B8.3]287// CHECK-NEXT: T: while [B8.4]288// CHECK-NEXT: Preds (2): B2 B9289// CHECK-NEXT: Succs (2): B7 B1290 291// CHECK: [B9]292// CHECK-NEXT: 1: 40293// CHECK-NEXT: 2: -[B9.1]294// CHECK-NEXT: 3: int i = -40;295// CHECK-NEXT: Preds (1): B10296// CHECK-NEXT: Succs (1): B8297 298// CHECK: [B0 (EXIT)]299// CHECK-NEXT: Preds (1): B1300void nested_loops1() {301 int i = -40;302 while (i < 2) {303 for (int j = 1; j < 6; j++)304 i++;305 }306}307 308// CHECK: [B9 (ENTRY)]309// CHECK-NEXT: Succs (1): B8310 311// CHECK: [B1]312// CHECK-NEXT: 1: ForStmt (LoopExit)313// CHECK-NEXT: Preds (1): B7314// CHECK-NEXT: Succs (1): B0315 316// CHECK: [B2]317// CHECK-NEXT: 1: j318// CHECK-NEXT: 2: [B2.1]++319// CHECK-NEXT: Preds (1): B3320// CHECK-NEXT: Succs (1): B7321 322// CHECK: [B3]323// CHECK-NEXT: 1: DoStmt (LoopExit)324// CHECK-NEXT: 2: i325// CHECK-NEXT: 3: [B3.2]--326// CHECK-NEXT: Preds (1): B4327// CHECK-NEXT: Succs (1): B2328 329// CHECK: [B4]330// CHECK-NEXT: 1: i331// CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, LValueToRValue, int)332// CHECK-NEXT: 3: 2333// CHECK-NEXT: 4: [B4.2] < [B4.3]334// CHECK-NEXT: T: do ... while [B4.4]335// CHECK-NEXT: Preds (1): B5336// CHECK-NEXT: Succs (2): B6 B3337 338// CHECK: [B5]339// CHECK-NEXT: 1: i340// CHECK-NEXT: 2: [B5.1]++341// CHECK-NEXT: Preds (2): B6 B7342// CHECK-NEXT: Succs (1): B4343 344// CHECK: [B6]345// CHECK-NEXT: Preds (1): B4346// CHECK-NEXT: Succs (1): B5347 348// CHECK: [B7]349// CHECK-NEXT: 1: j350// CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, int)351// CHECK-NEXT: 3: 6352// CHECK-NEXT: 4: [B7.2] < [B7.3]353// CHECK-NEXT: T: for (...; [B7.4]; ...)354// CHECK-NEXT: Preds (2): B2 B8355// CHECK-NEXT: Succs (2): B5 B1356 357// CHECK: [B8]358// CHECK-NEXT: 1: 40359// CHECK-NEXT: 2: -[B8.1]360// CHECK-NEXT: 3: int i = -40;361// CHECK-NEXT: 4: 1362// CHECK-NEXT: 5: int j = 1;363// CHECK-NEXT: Preds (1): B9364// CHECK-NEXT: Succs (1): B7365 366// CHECK: [B0 (EXIT)]367// CHECK-NEXT: Preds (1): B1368void nested_loops2() {369 int i = -40;370 for (int j = 1; j < 6; j++) {371 do {372 i++;373 } while (i < 2);374 i--;375 }376}377 378// CHECK: [B12 (ENTRY)]379// CHECK-NEXT: Succs (1): B11380 381// CHECK: [B1]382// CHECK-NEXT: 1: WhileStmt (LoopExit)383// CHECK-NEXT: 2: return;384// CHECK-NEXT: Preds (2): B3 B5385// CHECK-NEXT: Succs (1): B0386 387// CHECK: [B2]388// CHECK-NEXT: Preds (1): B4389// CHECK-NEXT: Succs (1): B5390 391// CHECK: [B3]392// CHECK-NEXT: T: break;393// CHECK-NEXT: Preds (1): B4394// CHECK-NEXT: Succs (1): B1395 396// CHECK: [B4]397// CHECK-NEXT: 1: i398// CHECK-NEXT: 2: [B4.1]++399// CHECK-NEXT: 3: i400// CHECK-NEXT: 4: [B4.3] (ImplicitCastExpr, LValueToRValue, int)401// CHECK-NEXT: 5: 2402// CHECK-NEXT: 6: [B4.4] % [B4.5]403// CHECK-NEXT: 7: [B4.6] (ImplicitCastExpr, IntegralToBoolean, _Bool)404// CHECK-NEXT: T: if [B4.7]405// CHECK-NEXT: Preds (1): B5406// CHECK-NEXT: Succs (2): B3 B2407 408// CHECK: [B5]409// CHECK-NEXT: 1: i410// CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, int)411// CHECK-NEXT: 3: 5412// CHECK-NEXT: 4: [B5.2] < [B5.3]413// CHECK-NEXT: T: while [B5.4]414// CHECK-NEXT: Preds (2): B2 B6415// CHECK-NEXT: Succs (2): B4 B1416 417// CHECK: [B6]418// CHECK-NEXT: 1: ForStmt (LoopExit)419// CHECK-NEXT: 2: 1420// CHECK-NEXT: 3: int i = 1;421// CHECK-NEXT: Preds (2): B8 B10422// CHECK-NEXT: Succs (1): B5423 424// CHECK: [B7]425// CHECK-NEXT: 1: i426// CHECK-NEXT: 2: [B7.1]++427// CHECK-NEXT: Preds (1): B9428// CHECK-NEXT: Succs (1): B10429 430// CHECK: [B8]431// CHECK-NEXT: T: break;432// CHECK-NEXT: Preds (1): B9433// CHECK-NEXT: Succs (1): B6434 435// CHECK: [B9]436// CHECK-NEXT: 1: i437// CHECK-NEXT: 2: [B9.1] (ImplicitCastExpr, LValueToRValue, int)438// CHECK-NEXT: 3: 4439// CHECK-NEXT: 4: [B9.2] == [B9.3]440// CHECK-NEXT: T: if [B9.4]441// CHECK-NEXT: Preds (1): B10442// CHECK-NEXT: Succs (2): B8 B7443 444// CHECK: [B10]445// CHECK-NEXT: 1: i446// CHECK-NEXT: 2: [B10.1] (ImplicitCastExpr, LValueToRValue, int)447// CHECK-NEXT: 3: 6448// CHECK-NEXT: 4: [B10.2] < [B10.3]449// CHECK-NEXT: T: for (...; [B10.4]; ...)450// CHECK-NEXT: Preds (2): B7 B11451// CHECK-NEXT: Succs (2): B9 B6452 453// CHECK: [B11]454// CHECK-NEXT: 1: 2455// CHECK-NEXT: 2: int i = 2;456// CHECK-NEXT: Preds (1): B12457// CHECK-NEXT: Succs (1): B10458 459// CHECK: [B0 (EXIT)]460// CHECK-NEXT: Preds (1): B1461void check_break()462{463 for(int i = 2; i < 6; i++) {464 if(i == 4)465 break;466 }467 468 int i = 1;469 while(i<5){470 i++;471 if(i%2)472 break;473 }474 475 return;476}477