Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s
      2 
      3 void clang_analyzer_eval(int);
      4 
      5 #include "Inputs/system-header-simulator.h"
      6 
      7 void use(int);
      8 id foo(int x) {
      9   if (x)
     10     return 0;
     11   static id p = foo(1); 
     12     clang_analyzer_eval(p == 0); // expected-warning{{TRUE}}
     13   return p;
     14 }
     15 
     16 const int &globalIntRef = 42;
     17 
     18 void testGlobalRef() {
     19   // FIXME: Should be TRUE, but should at least not crash.
     20   clang_analyzer_eval(globalIntRef == 42); // expected-warning{{UNKNOWN}}
     21 }
     22 
     23 extern int globalInt;
     24 struct IntWrapper {
     25   int value;
     26 };
     27 extern struct IntWrapper globalStruct;
     28 extern void invalidateGlobals();
     29 
     30 void testGlobalInvalidation() {
     31   clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
     32   clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
     33 
     34   if (globalInt != 42)
     35     return;
     36   if (globalStruct.value != 43)
     37     return;
     38   clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
     39   clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}
     40 
     41   invalidateGlobals();
     42   clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
     43   clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
     44 
     45   // Repeat to make sure we don't get the /same/ new symbolic values.
     46   if (globalInt != 42)
     47     return;
     48   if (globalStruct.value != 43)
     49     return;
     50   clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
     51   clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}
     52 
     53   invalidateGlobals();
     54   clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
     55   clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
     56 }
     57 
     58 void testGlobalInvalidationWithDirectBinding() {
     59   clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
     60   clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
     61 
     62   globalInt = 42;
     63   globalStruct.value = 43;
     64   clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
     65   clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}
     66 
     67   invalidateGlobals();
     68   clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
     69   clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
     70 }
     71 
     72 void testStaticLocals(void) {
     73   static int i;
     74   int tmp;
     75 
     76   extern int someSymbolicValue();
     77   i = someSymbolicValue();
     78 
     79   if (i == 5) {
     80     clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
     81     scanf("%d", &tmp);
     82     clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
     83     invalidateGlobals();
     84     clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
     85   }
     86 
     87   i = 6;
     88   clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
     89   scanf("%d", &tmp);
     90   clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
     91   invalidateGlobals();
     92   clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
     93 
     94   i = someSymbolicValue();
     95   if (i == 7) {
     96     clang_analyzer_eval(i == 7); // expected-warning{{TRUE}}
     97     scanf("%d", &i);
     98     clang_analyzer_eval(i == 7); // expected-warning{{UNKNOWN}}
     99   }
    100 
    101   i = 8;
    102   clang_analyzer_eval(i == 8); // expected-warning{{TRUE}}
    103   scanf("%d", &i);
    104   clang_analyzer_eval(i == 8); // expected-warning{{UNKNOWN}}
    105 }
    106 
    107 void testNonSystemGlobals(void) {
    108   extern int i;
    109   int tmp;
    110 
    111   if (i == 5) {
    112     clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
    113     scanf("%d", &tmp);
    114     clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
    115     invalidateGlobals();
    116     clang_analyzer_eval(i == 5); // expected-warning{{UNKNOWN}}
    117   }
    118 
    119   i = 6;
    120   clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
    121   scanf("%d", &tmp);
    122   clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
    123   invalidateGlobals();
    124   clang_analyzer_eval(i == 6); // expected-warning{{UNKNOWN}}
    125 
    126   if (i == 7) {
    127     clang_analyzer_eval(i == 7); // expected-warning{{TRUE}}
    128     scanf("%d", &i);
    129     clang_analyzer_eval(i == 7); // expected-warning{{UNKNOWN}}
    130   }
    131 
    132   i = 8;
    133   clang_analyzer_eval(i == 8); // expected-warning{{TRUE}}
    134   scanf("%d", &i);
    135   clang_analyzer_eval(i == 8); // expected-warning{{UNKNOWN}}
    136 }
    137 
    138 void testWrappedGlobals(void) {
    139   extern char c;
    140   SomeStruct s;
    141 
    142   if (c == 'C') {
    143     s.p = &c;
    144     clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
    145     fakeSystemHeaderCall(0);
    146     clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
    147     fakeSystemHeaderCall(&s);
    148     clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}}
    149   }
    150 
    151   c = 'c';
    152   s.p = &c;
    153   clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}}
    154   fakeSystemHeaderCall(0);
    155   clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}}
    156   fakeSystemHeaderCall(&s);
    157   clang_analyzer_eval(c == 'c'); // expected-warning{{UNKNOWN}}
    158 
    159   if (c == 'C') {
    160     s.p = &c;
    161     clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
    162     fakeSystemHeaderCall(0);
    163     clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
    164     fakeSystemHeaderCall(&s);
    165     clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}}
    166   }
    167 }
    168 
    169 void testWrappedStaticsViaGlobal(void) {
    170   static char c;
    171   extern SomeStruct s;
    172 
    173   extern char getSomeChar();
    174   c = getSomeChar();
    175 
    176   if (c == 'C') {
    177     s.p = &c;
    178     clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
    179     invalidateGlobals();
    180     clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}}
    181   }
    182 
    183   c = 'c';
    184   s.p = &c;
    185   clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}}
    186   invalidateGlobals();
    187   clang_analyzer_eval(c == 'c'); // expected-warning{{UNKNOWN}}
    188 }
    189