Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,core.experimental -analyzer-store=basic -analyzer-constraints=range -verify -fblocks %s
      2 // RUN: %clang_cc1 -analyze -analyzer-checker=core,core.experimental -analyzer-store=region -analyzer-constraints=range -verify -fblocks %s
      3 
      4 // <rdar://problem/6776949>
      5 // main's 'argc' argument is always > 0
      6 int main(int argc, char* argv[]) {
      7   int *p = 0;
      8 
      9   if (argc == 0)
     10     *p = 1;
     11 
     12   if (argc == 1)
     13     return 1;
     14 
     15   int x = 1;
     16   int i;
     17   
     18   for(i=1;i<argc;i++){
     19     p = &x;
     20   }
     21 
     22   return *p; // no-warning
     23 }
     24 
     25 // PR 5969: the comparison of argc < 3 || argc > 4 should constraint the switch
     26 //  statement from having the 'default' branch taken.  This previously reported a false
     27 //  positive with the use of 'v'.
     28 
     29 int pr5969(int argc, char *argv[]) {
     30 
     31   int v;
     32 
     33   if ((argc < 3) || (argc > 4)) return 0;
     34 
     35   switch(argc) {
     36     case 3:
     37       v = 33;
     38       break;
     39     case 4:
     40       v = 44;
     41       break;
     42   }
     43 
     44   return v; // no-warning
     45 }
     46 
     47 int pr5969_positive(int argc, char *argv[]) {
     48 
     49   int v;
     50 
     51   if ((argc < 3) || (argc > 4)) return 0;
     52 
     53   switch(argc) {
     54     case 3:
     55       v = 33;
     56       break;
     57   }
     58 
     59   return v; // expected-warning{{Undefined or garbage value returned to caller}}
     60 }
     61