Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -disable-free -analyzer-eagerly-assume -analyzer-checker=core,deadcode,debug.ExprInspection -verify %s
      2 
      3 void clang_analyzer_eval(int);
      4 
      5 int size_rdar9373039 = 1;
      6 int foo_rdar9373039(const char *);
      7 
      8 int rdar93730392() {
      9   int x;
     10   int j = 0;
     11 
     12   for (int i = 0 ; i < size_rdar9373039 ; ++i)
     13     x = 1;
     14 
     15   int extra = (2 + foo_rdar9373039 ("Clang") + ((4 - ((unsigned int) (2 + foo_rdar9373039 ("Clang")) % 4)) % 4)) + (2 + foo_rdar9373039 ("1.0") + ((4 - ((unsigned int) (2 + foo_rdar9373039 ("1.0")) % 4)) % 4)); // expected-warning {{never read}}
     16 
     17   for (int i = 0 ; i < size_rdar9373039 ; ++i)
     18     j += x; // expected-warning {{garbage}}
     19 
     20   return j;
     21 }
     22 
     23 
     24 int PR8962 (int *t) {
     25   // This should look through the __extension__ no-op.
     26   if (__extension__ (t)) return 0;
     27   return *t; // expected-warning {{null pointer}}
     28 }
     29 
     30 int PR8962_b (int *t) {
     31   // This should still ignore the nested casts
     32   // which aren't handled by a single IgnoreParens()
     33   if (((int)((int)t))) return 0;
     34   return *t; // expected-warning {{null pointer}}
     35 }
     36 
     37 int PR8962_c (int *t) {
     38   // If the last element in a StmtExpr was a ParenExpr, it's still live
     39   if (({ (t ? (_Bool)0 : (_Bool)1); })) return 0;
     40   return *t; // no-warning
     41 }
     42 
     43 int PR8962_d (int *t) {
     44   // If the last element in a StmtExpr is an __extension__, it's still live
     45   if (({ __extension__(t ? (_Bool)0 : (_Bool)1); })) return 0;
     46   return *t; // no-warning
     47 }
     48 
     49 int PR8962_e (int *t) {
     50   // Redundant casts can mess things up!
     51   // Environment used to skip through NoOp casts, but LiveVariables didn't!
     52   if (({ (t ? (int)(int)0L : (int)(int)1L); })) return 0;
     53   return *t; // no-warning
     54 }
     55 
     56 int PR8962_f (int *t) {
     57   // The StmtExpr isn't a block-level expression here,
     58   // the __extension__ is. But the value should be attached to the StmtExpr
     59   // anyway. Make sure the block-level check is /before/ IgnoreParens.
     60   if ( __extension__({
     61     _Bool r;
     62     if (t) r = 0;
     63     else r = 1;
     64     r;
     65   }) ) return 0;
     66   return *t; // no-warning
     67 }
     68 
     69 // This previously crashed logic in the analyzer engine when evaluating locations.
     70 void rdar10308201_aux(unsigned val);
     71 void rdar10308201 (int valA, void *valB, unsigned valC) {
     72   unsigned actual_base, lines;
     73   if (valC == 0) {
     74     actual_base = (unsigned)valB;
     75     for (;;) {
     76       if (valA & (1<<0))
     77         rdar10308201_aux(actual_base);
     78     }
     79   }
     80 }
     81 
     82 typedef struct Struct103 {
     83   unsigned i;
     84 } Struct103;
     85 typedef unsigned int size_t;
     86 void __my_memset_chk(char*, int, size_t);
     87 static int radar10367606(int t) {
     88   Struct103 overall;
     89   ((__builtin_object_size ((char *) &overall, 0) != (size_t) -1) ? __builtin___memset_chk ((char *) &overall, 0, sizeof(Struct103), __builtin_object_size ((char *) &overall, 0)) : __my_memset_chk ((char *) &overall, 0, sizeof(Struct103)));
     90   return 0;
     91 }
     92 
     93 /* Caching out on a sink node. */
     94 extern int fooR10376675();
     95 extern int* bazR10376675();
     96 extern int nR10376675;
     97 void barR10376675(int *x) {
     98   int *pm;
     99   if (nR10376675 * 2) {
    100     int *pk  = bazR10376675();
    101     pm = pk; //expected-warning {{never read}}
    102   }
    103   do {
    104     *x = fooR10376675();
    105   } while (0);
    106 }
    107 
    108 // Test accesses to wide character strings doesn't break the analyzer.
    109 typedef int wchar_t;
    110 struct rdar10385775 {
    111     wchar_t *name;
    112 };
    113 void RDar10385775(struct rdar10385775* p) {
    114     p->name = L"a";
    115 }
    116 
    117 // Test double loop of array and array literals.  Previously this
    118 // resulted in a false positive uninitailized value warning.
    119 void rdar10686586() {
    120     int array1[] = { 1, 2, 3, 0 };
    121     int array2[] = { 1, 2, 3, 0 };
    122     int *array[] = { array1, array2 };
    123     int sum = 0;
    124     for (int i = 0; i < 2; i++) {
    125         for (int j = 0; j < 4; j++) {
    126             sum += array[i][j]; // no-warning
    127         }
    128     }
    129 }
    130 
    131 // This example tests CFG handling of '||' nested in a ternary expression,
    132 // and seeing that the analyzer doesn't crash.
    133 int isctype(char c, unsigned long f)
    134 {
    135   return (c < 1 || c > 10) ? 0 : !!(c & f);
    136 }
    137 
    138 // Test that symbolic array offsets are modeled conservatively.
    139 // This was triggering a false "use of uninitialized value" warning.
    140 void rdar_12075238__aux(unsigned long y);
    141 int rdar_12075238_(unsigned long count) {
    142   if ((count < 3) || (count > 6))
    143     return 0;
    144 
    145   unsigned long array[6];
    146   unsigned long i = 0;
    147   for (; i <= count - 2; i++)
    148   {
    149 	  array[i] = i;
    150   }
    151   array[count - 1] = i;
    152   rdar_12075238__aux(array[2]); // no-warning
    153   return 0;
    154 }
    155 
    156 // Test that we handle an uninitialized value within a logical expression.
    157 void PR14635(int *p) {
    158   int a = 0, b;
    159   *p = a || b; // expected-warning {{Assigned value is garbage or undefined}}
    160 }
    161 
    162 // Test handling floating point values with unary '!'.
    163 int PR14634(int x) {
    164   double y = (double)x;
    165   return !y;
    166 }
    167 
    168 
    169 // PR15684: If a checker generates a sink node after generating a regular node
    170 // and no state changes between the two, graph trimming would consider the two
    171 // the same node, forming a loop.
    172 struct PR15684 {
    173   void (*callback)(int);
    174 };
    175 void sinkAfterRegularNode(struct PR15684 *context) {
    176   int uninitialized;
    177   context->callback(uninitialized); // expected-warning {{uninitialized}}
    178 }
    179 
    180 
    181 // PR16131: C permits variables to be declared extern void.
    182 static void PR16131(int x) {
    183   extern void v;
    184 
    185   int *ip = (int *)&v;
    186   char *cp = (char *)&v;
    187   clang_analyzer_eval(ip == cp); // expected-warning{{TRUE}}
    188   // expected-warning@-1 {{comparison of distinct pointer types}}
    189 
    190   *ip = 42;
    191   clang_analyzer_eval(*ip == 42); // expected-warning{{TRUE}}
    192   clang_analyzer_eval(*(int *)&v == 42); // expected-warning{{TRUE}}
    193 }
    194