1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s 2*67e74705SXin Li 3*67e74705SXin Li void clang_analyzer_eval(int); 4*67e74705SXin Li void clang_analyzer_warnIfReached(); 5*67e74705SXin Li 6*67e74705SXin Li #define INT_MIN 0x80000000 7*67e74705SXin Li #define INT_MAX 0x7fffffff 8*67e74705SXin Li 9*67e74705SXin Li // PR16833: Analyzer consumes memory until killed by kernel OOM killer 10*67e74705SXin Li // while analyzing large case ranges. PR16833(unsigned op)11*67e74705SXin Livoid PR16833(unsigned op) { 12*67e74705SXin Li switch (op) { 13*67e74705SXin Li case 0x02 << 26 ... 0x03 << 26: // Analyzer should not hang here. 14*67e74705SXin Li return; 15*67e74705SXin Li } 16*67e74705SXin Li } 17*67e74705SXin Li testAdjustment(int t)18*67e74705SXin Livoid testAdjustment(int t) { 19*67e74705SXin Li switch (t + 1) { 20*67e74705SXin Li case 2: 21*67e74705SXin Li clang_analyzer_eval(t == 1); // expected-warning{{TRUE}} 22*67e74705SXin Li break; 23*67e74705SXin Li case 3 ... 10: 24*67e74705SXin Li clang_analyzer_eval(t > 1); // expected-warning{{TRUE}} 25*67e74705SXin Li clang_analyzer_eval(t + 2 <= 11); // expected-warning{{TRUE}} 26*67e74705SXin Li clang_analyzer_eval(t > 2); // expected-warning{{UNKNOWN}} 27*67e74705SXin Li clang_analyzer_eval(t + 1 == 3); // expected-warning{{UNKNOWN}} 28*67e74705SXin Li clang_analyzer_eval(t + 1 == 10); // expected-warning{{UNKNOWN}} 29*67e74705SXin Li break; 30*67e74705SXin Li default: 31*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 32*67e74705SXin Li } 33*67e74705SXin Li } 34*67e74705SXin Li testUnknownVal(int value,int mask)35*67e74705SXin Livoid testUnknownVal(int value, int mask) { 36*67e74705SXin Li // Once ConstraintManager will process '&' and this test will require some changes. 37*67e74705SXin Li switch (value & mask) { 38*67e74705SXin Li case 1: 39*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 40*67e74705SXin Li break; 41*67e74705SXin Li case 3 ... 10: 42*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 43*67e74705SXin Li break; 44*67e74705SXin Li default: 45*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 46*67e74705SXin Li } 47*67e74705SXin Li } 48*67e74705SXin Li testSwitchCond(int arg)49*67e74705SXin Livoid testSwitchCond(int arg) { 50*67e74705SXin Li if (arg > 10) { 51*67e74705SXin Li switch (arg) { 52*67e74705SXin Li case INT_MIN ... 10: 53*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 54*67e74705SXin Li break; 55*67e74705SXin Li case 11 ... 20: 56*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 57*67e74705SXin Li break; 58*67e74705SXin Li default: 59*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 60*67e74705SXin Li } 61*67e74705SXin Li 62*67e74705SXin Li switch (arg) { 63*67e74705SXin Li case INT_MIN ... 9: 64*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 65*67e74705SXin Li break; 66*67e74705SXin Li case 10 ... 20: 67*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 68*67e74705SXin Li clang_analyzer_eval(arg > 10); // expected-warning{{TRUE}} 69*67e74705SXin Li break; 70*67e74705SXin Li default: 71*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 72*67e74705SXin Li } 73*67e74705SXin Li } // arg > 10 74*67e74705SXin Li } 75*67e74705SXin Li testDefaultUnreachable(int arg)76*67e74705SXin Livoid testDefaultUnreachable(int arg) { 77*67e74705SXin Li if (arg > 10) { 78*67e74705SXin Li switch (arg) { 79*67e74705SXin Li case INT_MIN ... 9: 80*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 81*67e74705SXin Li break; 82*67e74705SXin Li case 10 ... INT_MAX: 83*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 84*67e74705SXin Li clang_analyzer_eval(arg > 10); // expected-warning{{TRUE}} 85*67e74705SXin Li break; 86*67e74705SXin Li default: 87*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 88*67e74705SXin Li } 89*67e74705SXin Li } 90*67e74705SXin Li } 91*67e74705SXin Li testBranchReachability(int arg)92*67e74705SXin Livoid testBranchReachability(int arg) { 93*67e74705SXin Li if (arg > 10 && arg < 20) { 94*67e74705SXin Li switch (arg) { 95*67e74705SXin Li case INT_MIN ... 4: 96*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 97*67e74705SXin Li break; 98*67e74705SXin Li case 5 ... 9: 99*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 100*67e74705SXin Li break; 101*67e74705SXin Li case 10 ... 15: 102*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 103*67e74705SXin Li clang_analyzer_eval(arg > 10 && arg <= 15); // expected-warning{{TRUE}} 104*67e74705SXin Li break; 105*67e74705SXin Li default: 106*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 107*67e74705SXin Li break; 108*67e74705SXin Li case 17 ... 25: 109*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 110*67e74705SXin Li clang_analyzer_eval(arg >= 17 && arg < 20); // expected-warning{{TRUE}} 111*67e74705SXin Li break; 112*67e74705SXin Li case 26 ... INT_MAX: 113*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 114*67e74705SXin Li break; 115*67e74705SXin Li case 16: 116*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 117*67e74705SXin Li clang_analyzer_eval(arg == 16); // expected-warning{{TRUE}} 118*67e74705SXin Li break; 119*67e74705SXin Li } 120*67e74705SXin Li } 121*67e74705SXin Li } 122*67e74705SXin Li testDefaultBranchRange(int arg)123*67e74705SXin Livoid testDefaultBranchRange(int arg) { 124*67e74705SXin Li switch (arg) { 125*67e74705SXin Li case INT_MIN ... 9: 126*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 127*67e74705SXin Li break; 128*67e74705SXin Li case 20 ... INT_MAX: 129*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 130*67e74705SXin Li clang_analyzer_eval(arg >= 20); // expected-warning{{TRUE}} 131*67e74705SXin Li break; 132*67e74705SXin Li default: 133*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 134*67e74705SXin Li clang_analyzer_eval(arg == 16); // expected-warning{{FALSE}} 135*67e74705SXin Li clang_analyzer_eval(arg > 9); // expected-warning{{TRUE}} 136*67e74705SXin Li clang_analyzer_eval(arg <= 20); // expected-warning{{TRUE}} 137*67e74705SXin Li 138*67e74705SXin Li case 16: 139*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 140*67e74705SXin Li } 141*67e74705SXin Li } 142*67e74705SXin Li testAllUnreachableButDefault(int arg)143*67e74705SXin Livoid testAllUnreachableButDefault(int arg) { 144*67e74705SXin Li if (arg < 0) { 145*67e74705SXin Li switch (arg) { 146*67e74705SXin Li case 0 ... 9: 147*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 148*67e74705SXin Li break; 149*67e74705SXin Li case 20 ... INT_MAX: 150*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 151*67e74705SXin Li break; 152*67e74705SXin Li default: 153*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 154*67e74705SXin Li break; 155*67e74705SXin Li case 16: 156*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 157*67e74705SXin Li } 158*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 159*67e74705SXin Li } 160*67e74705SXin Li } 161*67e74705SXin Li testAllUnreachable(int arg)162*67e74705SXin Livoid testAllUnreachable(int arg) { 163*67e74705SXin Li if (arg < 0) { 164*67e74705SXin Li switch (arg) { 165*67e74705SXin Li case 0 ... 9: 166*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 167*67e74705SXin Li break; 168*67e74705SXin Li case 20 ... INT_MAX: 169*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 170*67e74705SXin Li break; 171*67e74705SXin Li case 16: 172*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 173*67e74705SXin Li } 174*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 175*67e74705SXin Li } 176*67e74705SXin Li } 177*67e74705SXin Li testDifferentTypes(int arg)178*67e74705SXin Livoid testDifferentTypes(int arg) { 179*67e74705SXin Li switch (arg) { 180*67e74705SXin Li case -1U ... 400000000LL: 181*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 182*67e74705SXin Li break; 183*67e74705SXin Li default: 184*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 185*67e74705SXin Li break; 186*67e74705SXin Li } 187*67e74705SXin Li } 188*67e74705SXin Li testDifferentTypes2(unsigned long arg)189*67e74705SXin Livoid testDifferentTypes2(unsigned long arg) { 190*67e74705SXin Li switch (arg) { 191*67e74705SXin Li case 1UL ... 400000000UL: 192*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 193*67e74705SXin Li break; 194*67e74705SXin Li default: 195*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 196*67e74705SXin Li break; 197*67e74705SXin Li } 198*67e74705SXin Li } 199*67e74705SXin Li testDifferentTypes3(int arg)200*67e74705SXin Livoid testDifferentTypes3(int arg) { 201*67e74705SXin Li switch (arg) { 202*67e74705SXin Li case 1UL ... 400000000UL: 203*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 204*67e74705SXin Li break; 205*67e74705SXin Li default: 206*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 207*67e74705SXin Li break; 208*67e74705SXin Li } 209*67e74705SXin Li } 210*67e74705SXin Li testConstant()211*67e74705SXin Livoid testConstant() { 212*67e74705SXin Li switch (3) { 213*67e74705SXin Li case 1 ... 5: 214*67e74705SXin Li clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 215*67e74705SXin Li break; 216*67e74705SXin Li default: 217*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 218*67e74705SXin Li break; 219*67e74705SXin Li } 220*67e74705SXin Li } 221