brintos

brintos / llvm-project-archived public Read only

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