Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -triple i386-apple-darwin9 -analyze -analyzer-checker=core,alpha.core -analyzer-store=region -verify -fblocks -analyzer-opt-analyze-nested-blocks %s -fexceptions -fcxx-exceptions
      2 // RUN: %clang_cc1 -triple x86_64-apple-darwin9 -analyze -analyzer-checker=core,alpha.core -analyzer-store=region -verify -fblocks -analyzer-opt-analyze-nested-blocks %s -fexceptions -fcxx-exceptions
      3 
      4 // Test basic handling of references.
      5 char &test1_aux();
      6 char *test1() {
      7   return &test1_aux();
      8 }
      9 
     10 // Test test1_aux() evaluates to char &.
     11 char test1_as_rvalue() {
     12   return test1_aux();
     13 }
     14 
     15 // Test passing a value as a reference.  The 'const' in test2_aux() adds
     16 // an ImplicitCastExpr, which is evaluated as an lvalue.
     17 int test2_aux(const int &n);
     18 int test2(int n) {
     19   return test2_aux(n);
     20 }
     21 
     22 int test2_b_aux(const short &n);
     23 int test2_b(int n) {
     24   return test2_b_aux(n);
     25 }
     26 
     27 // Test getting the lvalue of a derived and converting it to a base.  This
     28 // previously crashed.
     29 class Test3_Base {};
     30 class Test3_Derived : public Test3_Base {};
     31 
     32 int test3_aux(Test3_Base &x);
     33 int test3(Test3_Derived x) {
     34   return test3_aux(x);
     35 }
     36 
     37 //===---------------------------------------------------------------------===//
     38 // Test CFG support for C++ condition variables.
     39 //===---------------------------------------------------------------------===//
     40 
     41 int test_init_in_condition_aux();
     42 int test_init_in_condition() {
     43   if (int x = test_init_in_condition_aux()) { // no-warning
     44     return 1;
     45   }
     46   return 0;
     47 }
     48 
     49 int test_init_in_condition_switch() {
     50   switch (int x = test_init_in_condition_aux()) { // no-warning
     51     case 1:
     52       return 0;
     53     case 2:
     54       if (x == 2)
     55         return 0;
     56       else {
     57         // Unreachable.
     58         int *p = 0;
     59         *p = 0xDEADBEEF; // no-warning
     60       }
     61     default:
     62       break;
     63   }
     64   return 0;
     65 }
     66 
     67 int test_init_in_condition_while() {
     68   int z = 0;
     69   while (int x = ++z) { // no-warning
     70     if (x == 2)
     71       break;
     72   }
     73 
     74   if (z == 2)
     75     return 0;
     76 
     77   int *p = 0;
     78   *p = 0xDEADBEEF; // no-warning
     79   return 0;
     80 }
     81 
     82 
     83 int test_init_in_condition_for() {
     84   int z = 0;
     85   for (int x = 0; int y = ++z; ++x) {
     86     if (x == y) // no-warning
     87       break;
     88   }
     89   if (z == 1)
     90     return 0;
     91 
     92   int *p = 0;
     93   *p = 0xDEADBEEF; // no-warning
     94   return 0;
     95 }
     96 
     97 //===---------------------------------------------------------------------===//
     98 // Test handling of 'this' pointer.
     99 //===---------------------------------------------------------------------===//
    100 
    101 class TestHandleThis {
    102   int x;
    103 
    104   TestHandleThis();
    105   int foo();
    106   int null_deref_negative();
    107   int null_deref_positive();
    108 };
    109 
    110 int TestHandleThis::foo() {
    111   // Assume that 'x' is initialized.
    112   return x + 1; // no-warning
    113 }
    114 
    115 int TestHandleThis::null_deref_negative() {
    116   x = 10;
    117   if (x == 10) {
    118     return 1;
    119   }
    120   int *p = 0;
    121   *p = 0xDEADBEEF; // no-warning
    122   return 0;
    123 }
    124 
    125 int TestHandleThis::null_deref_positive() {
    126   x = 10;
    127   if (x == 9) {
    128     return 1;
    129   }
    130   int *p = 0;
    131   *p = 0xDEADBEEF; // expected-warning{{null pointer}}
    132   return 0;
    133 }
    134 
    135 // PR 7675 - passing literals by-reference
    136 void pr7675(const double &a);
    137 void pr7675(const int &a);
    138 void pr7675(const char &a);
    139 void pr7675_i(const _Complex double &a);
    140 
    141 void pr7675_test() {
    142   pr7675(10.0);
    143   pr7675(10);
    144   pr7675('c');
    145   pr7675_i(4.0i);
    146   // Add null deref to ensure we are analyzing the code up to this point.
    147   int *p = 0;
    148   *p = 0xDEADBEEF; // expected-warning{{null pointer}}
    149 }
    150 
    151 // <rdar://problem/8375510> - CFGBuilder should handle temporaries.
    152 struct R8375510 {
    153   R8375510();
    154   ~R8375510();
    155   R8375510 operator++(int);
    156 };
    157 
    158 int r8375510(R8375510 x, R8375510 y) {
    159   for (; ; x++) { }
    160 }
    161 
    162 // PR8419 -- this used to crash.
    163 
    164 class String8419 {
    165  public:
    166   char& get(int n);
    167   char& operator[](int n);
    168 };
    169 
    170 char& get8419();
    171 
    172 void Test8419() {
    173   String8419 s;
    174   ++(s.get(0));
    175   get8419()--;  // used to crash
    176   --s[0];       // used to crash
    177   s[0] &= 1;    // used to crash
    178   s[0]++;       // used to crash
    179 }
    180 
    181 // PR8426 -- this used to crash.
    182 
    183 void Use(void* to);
    184 
    185 template <class T> class Foo {
    186   ~Foo();
    187   struct Bar;
    188   Bar* bar_;
    189 };
    190 
    191 template <class T> Foo<T>::~Foo() {
    192   Use(bar_);
    193   T::DoSomething();
    194   bar_->Work();
    195 }
    196 
    197 // PR8427 -- this used to crash.
    198 
    199 class Dummy {};
    200 
    201 bool operator==(Dummy, int);
    202 
    203 template <typename T>
    204 class Foo2 {
    205   bool Bar();
    206 };
    207 
    208 template <typename T>
    209 bool Foo2<T>::Bar() {
    210   return 0 == T();
    211 }
    212 
    213 // PR8433 -- this used to crash.
    214 
    215 template <typename T>
    216 class Foo3 {
    217  public:
    218   void Bar();
    219   void Baz();
    220   T value_;
    221 };
    222 
    223 template <typename T>
    224 void Foo3<T>::Bar() {
    225   Baz();
    226   value_();
    227 }
    228 
    229 //===---------------------------------------------------------------------===//
    230 // Handle misc. C++ constructs.
    231 //===---------------------------------------------------------------------===//
    232 
    233 namespace fum {
    234   int i = 3;
    235 };
    236 
    237 void test_namespace() {
    238   // Previously triggered a crash.
    239   using namespace fum;
    240   int x = i;
    241 }
    242 
    243 // Test handling methods that accept references as parameters, and that
    244 // variables are properly invalidated.
    245 class RDar9203355 {
    246   bool foo(unsigned valA, long long &result) const;
    247   bool foo(unsigned valA, int &result) const;
    248 };
    249 bool RDar9203355::foo(unsigned valA, int &result) const {
    250   long long val;
    251   if (foo(valA, val) ||
    252       (int)val != val) // no-warning
    253     return true;
    254   result = val; // no-warning
    255   return false;
    256 }
    257 
    258 // Test handling of new[].
    259 void rdar9212512() {
    260   int *x = new int[10];
    261   for (unsigned i = 0 ; i < 2 ; ++i) {
    262     // This previously triggered an uninitialized values warning.
    263     x[i] = 1;  // no-warning
    264   }
    265 }
    266 
    267 // Test basic support for dynamic_cast<>.
    268 struct Rdar9212495_C { virtual void bar() const; };
    269 class Rdar9212495_B : public Rdar9212495_C {};
    270 class Rdar9212495_A : public Rdar9212495_B {};
    271 const Rdar9212495_A& rdar9212495(const Rdar9212495_C* ptr) {
    272   const Rdar9212495_A& val = dynamic_cast<const Rdar9212495_A&>(*ptr);
    273 
    274   // This is not valid C++; dynamic_cast with a reference type will throw an
    275   // exception if the pointer does not match the expected type. However, our
    276   // implementation of dynamic_cast will pass through a null pointer...or a
    277   // "null reference"! So this branch is actually possible.
    278   if (&val == 0) {
    279     val.bar(); // expected-warning{{Called C++ object pointer is null}}
    280   }
    281 
    282   return val;
    283 }
    284 
    285 const Rdar9212495_A* rdar9212495_ptr(const Rdar9212495_C* ptr) {
    286   const Rdar9212495_A* val = dynamic_cast<const Rdar9212495_A*>(ptr);
    287 
    288   if (val == 0) {
    289     val->bar(); // expected-warning{{Called C++ object pointer is null}}
    290   }
    291 
    292   return val;
    293 }
    294 
    295 // Test constructors invalidating arguments.  Previously this raised
    296 // an uninitialized value warning.
    297 extern "C" void __attribute__((noreturn)) PR9645_exit(int i);
    298 
    299 class PR9645_SideEffect
    300 {
    301 public:
    302   PR9645_SideEffect(int *pi); // caches pi in i_
    303   void Read(int *pi); // copies *pi into *i_
    304 private:
    305   int *i_;
    306 };
    307 
    308 void PR9645() {
    309   int i;
    310 
    311   PR9645_SideEffect se(&i);
    312   int j = 1;
    313   se.Read(&j); // this has a side-effect of initializing i.
    314 
    315   PR9645_exit(i); // no-warning
    316 }
    317 
    318 PR9645_SideEffect::PR9645_SideEffect(int *pi) : i_(pi) {}
    319 void PR9645_SideEffect::Read(int *pi) { *i_ = *pi; }
    320 
    321 // Invalidate fields during C++ method calls.
    322 class RDar9267815 {
    323   int x;
    324   void test();
    325   void test_pos();
    326   void test2();
    327   void invalidate();
    328 };
    329 
    330 void RDar9267815::test_pos() {
    331   int *p = 0;
    332   if (x == 42)
    333     return;
    334   *p = 0xDEADBEEF; // expected-warning {{null}}
    335 }
    336 void RDar9267815::test() {
    337   int *p = 0;
    338   if (x == 42)
    339     return;
    340   if (x == 42)
    341     *p = 0xDEADBEEF; // no-warning
    342 }
    343 
    344 void RDar9267815::test2() {
    345   int *p = 0;
    346   if (x == 42)
    347     return;
    348   invalidate();
    349   if (x == 42)
    350     *p = 0xDEADBEEF; // expected-warning {{null}}
    351 }
    352 
    353 // Test reference parameters.
    354 void test_ref_double_aux(double &Value);
    355 float test_ref_double() {
    356   double dVal;
    357   test_ref_double_aux(dVal);
    358   // This previously warned because 'dVal' was thought to be uninitialized.
    359   float Val = (float)dVal; // no-warning
    360   return Val;
    361 }
    362 
    363 // Test invalidation of class fields.
    364 class TestInvalidateClass {
    365 public:
    366   int x;
    367 };
    368 
    369 void test_invalidate_class_aux(TestInvalidateClass &x);
    370 
    371 int test_invalidate_class() {
    372   TestInvalidateClass y;
    373   test_invalidate_class_aux(y);
    374   return y.x; // no-warning
    375 }
    376 
    377 // Test correct pointer arithmetic using 'p--'.  This is to warn that we
    378 // were loading beyond the written characters in buf.
    379 char *RDar9269695(char *dst, unsigned int n)
    380 {
    381   char buff[40], *p;
    382 
    383   p = buff;
    384   do
    385     *p++ = '0' + n % 10;
    386   while (n /= 10);
    387 
    388   do
    389     *dst++ = *--p; // no-warning
    390   while (p != buff);
    391 
    392   return dst;
    393 }
    394 
    395 // Test that we invalidate byref arguments passed to constructors.
    396 class TestInvalidateInCtor {
    397 public:
    398   TestInvalidateInCtor(unsigned &x);
    399 };
    400 
    401 unsigned test_invalidate_in_ctor() {
    402   unsigned x;
    403   TestInvalidateInCtor foo(x);
    404   return x; // no-warning
    405 }
    406 unsigned test_invalidate_in_ctor_new() {
    407   unsigned x;
    408   delete (new TestInvalidateInCtor(x));
    409   return x; // no-warning
    410 }
    411 
    412 // Test assigning into a symbolic offset.
    413 struct TestAssignIntoSymbolicOffset {
    414   int **stuff[100];
    415   void test(int x, int y);
    416 };
    417 
    418 void TestAssignIntoSymbolicOffset::test(int x, int y) {
    419   x--;
    420   if (x > 8 || x < 0)
    421     return;
    422   if (stuff[x])
    423     return;
    424   if (!stuff[x]) {
    425     stuff[x] = new int*[y+1];
    426     // Previously triggered a null dereference.
    427     stuff[x][y] = 0; // no-warning
    428   }
    429 }
    430 
    431 // Test loads from static fields.  This previously triggered an uninitialized
    432 // value warning.
    433 class ClassWithStatic {
    434 public:
    435     static const unsigned value = 1;
    436 };
    437 
    438 int rdar9948787_negative() {
    439     ClassWithStatic classWithStatic;
    440     unsigned value = classWithStatic.value;
    441     if (value == 1)
    442       return 1;
    443     int *p = 0;
    444     *p = 0xDEADBEEF; // no-warning
    445     return 0;
    446 }
    447 
    448 int rdar9948787_positive() {
    449     ClassWithStatic classWithStatic;
    450     unsigned value = classWithStatic.value;
    451     if (value == 0)
    452       return 1;
    453     int *p = 0;
    454     *p = 0xDEADBEEF; // expected-warning {{null}}
    455     return 0;
    456 }
    457 
    458 // Regression test against global constants and switches.
    459 enum rdar10202899_ValT { rdar10202899_ValTA, rdar10202899_ValTB, rdar10202899_ValTC };
    460 const rdar10202899_ValT val = rdar10202899_ValTA;
    461 void rdar10202899_test1() {
    462   switch (val) {
    463     case rdar10202899_ValTA: {}
    464   };
    465 }
    466 
    467 void rdar10202899_test2() {
    468   if (val == rdar10202899_ValTA)
    469    return;
    470   int *p = 0;
    471   *p = 0xDEADBEEF;
    472 }
    473 
    474 void rdar10202899_test3() {
    475   switch (val) {
    476     case rdar10202899_ValTA: return;
    477     default: ;
    478   };
    479   int *p = 0;
    480   *p = 0xDEADBEEF;
    481 }
    482 
    483 // This used to crash the analyzer because of the unnamed bitfield.
    484 void PR11249()
    485 {
    486   struct {
    487     char f1:4;
    488     char   :4;
    489     char f2[1];
    490     char f3;
    491   } V = { 1, {2}, 3 };
    492   int *p = 0;
    493   if (V.f1 != 1)
    494     *p = 0xDEADBEEF;  // no-warning
    495   if (V.f2[0] != 2)
    496     *p = 0xDEADBEEF;  // no-warning
    497   if (V.f3 != 3)
    498     *p = 0xDEADBEEF;  // no-warning
    499 }
    500 
    501 // Handle doing a load from the memory associated with the code for
    502 // a function.
    503 extern double nan( const char * );
    504 double PR11450() {
    505   double NaN = *(double*) nan;
    506   return NaN;
    507 }
    508 
    509 // Test that 'this' is assumed non-null upon analyzing the entry to a "top-level"
    510 // function (i.e., when not analyzing from a specific caller).
    511 struct TestNullThis {
    512   int field;
    513   void test();
    514 };
    515 
    516 void TestNullThis::test() {
    517   int *p = &field;
    518   if (p)
    519     return;
    520   field = 2; // no-warning
    521 }
    522 
    523 // Test handling of 'catch' exception variables, and not warning
    524 // about uninitialized values.
    525 enum MyEnum { MyEnumValue };
    526 MyEnum rdar10892489() {
    527   try {
    528       throw MyEnumValue;
    529   } catch (MyEnum e) {
    530       return e; // no-warning
    531   }
    532   return MyEnumValue;
    533 }
    534 
    535 MyEnum rdar10892489_positive() {
    536   try {
    537     throw MyEnumValue;
    538   } catch (MyEnum e) {
    539     int *p = 0;
    540     // FALSE NEGATIVE
    541     *p = 0xDEADBEEF; // {{null}}
    542     return e;
    543   }
    544   return MyEnumValue;
    545 }
    546 
    547 // Test handling of catch with no condition variable.
    548 void PR11545() {
    549   try
    550   {
    551       throw;
    552   }
    553   catch (...)
    554   {
    555   }
    556 }
    557 
    558 void PR11545_positive() {
    559   try
    560   {
    561       throw;
    562   }
    563   catch (...)
    564   {
    565     int *p = 0;
    566     // FALSE NEGATIVE
    567     *p = 0xDEADBEEF; // {{null}}
    568   }
    569 }
    570 
    571 // Test handling taking the address of a field.  While the analyzer
    572 // currently doesn't do anything intelligent here, this previously
    573 // resulted in a crash.
    574 class PR11146 {
    575 public:
    576   struct Entry;
    577   void baz();
    578 };
    579 
    580 struct PR11146::Entry {
    581   int x;
    582 };
    583 
    584 void PR11146::baz() {
    585   (void) &Entry::x;
    586 }
    587 
    588 // Test symbolicating a reference.  In this example, the
    589 // analyzer (originally) didn't know how to handle x[index - index2],
    590 // returning an UnknownVal.  The conjured symbol wasn't a location,
    591 // and would result in a crash.
    592 void rdar10924675(unsigned short x[], int index, int index2) {
    593   unsigned short &y = x[index - index2];
    594   if (y == 0)
    595     return;
    596 }
    597 
    598 // Test handling CXXScalarValueInitExprs.
    599 void rdar11401827() {
    600   int x = int();
    601   if (!x) {
    602     int *p = 0;
    603     *p = 0xDEADBEEF; // expected-warning {{null pointer}}
    604   }
    605   else {
    606     int *p = 0;
    607     *p = 0xDEADBEEF;
    608   }
    609 }
    610 
    611 //===---------------------------------------------------------------------===//
    612 // Handle inlining of C++ method calls.
    613 //===---------------------------------------------------------------------===//
    614 
    615 struct A {
    616   int *p;
    617   void foo(int *q) {
    618     p = q;
    619   }
    620   void bar() {
    621     *p = 0; // expected-warning {{null pointer}}
    622   }
    623 };
    624 
    625 void test_inline() {
    626   A a;
    627   a.foo(0);
    628   a.bar();
    629 }
    630 
    631 void test_alloca_in_a_recursive_function(int p1) {
    632     __builtin_alloca (p1);
    633     test_alloca_in_a_recursive_function(1);
    634     test_alloca_in_a_recursive_function(2);
    635 }
    636 
    637 //===---------------------------------------------------------------------===//
    638 // Random tests.
    639 //===---------------------------------------------------------------------===//
    640 
    641 // Tests assigning using a C-style initializer to a struct
    642 // variable whose sub-field is also a struct.  This currently
    643 // results in a CXXTempObjectRegion being created, but not
    644 // properly handled.  For now, we just ignore that value
    645 // to avoid a crash (<rdar://problem/12753384>).
    646 struct RDar12753384_ClassA {
    647   unsigned z;
    648 };
    649 struct  RDar12753384_ClassB {
    650   unsigned x;
    651   RDar12753384_ClassA y[ 8 ] ;
    652 };
    653 unsigned RDar12753384() {
    654   RDar12753384_ClassB w = { 0x00 };
    655   RDar12753384_ClassA y[8];
    656   return w.x;
    657 }
    658 
    659 // This testcase tests whether we treat the anonymous union and union
    660 // the same way.  This previously resulted in a "return of stack address"
    661 // warning because the anonymous union resulting in a temporary object
    662 // getting put into the initializer.  We still aren't handling this correctly,
    663 // but now if a temporary object appears in an initializer we just ignore it.
    664 // Fixes <rdar://problem/12755044>.
    665 
    666 struct Rdar12755044_foo
    667 {
    668     struct Rdar12755044_bar
    669     {
    670         union baz
    671         {
    672             int   i;
    673         };
    674     } aBar;
    675 };
    676 
    677 struct Rdar12755044_foo_anon
    678 {
    679     struct Rdar12755044_bar
    680     {
    681         union
    682         {
    683             int   i;
    684         };
    685     } aBar;
    686 };
    687 
    688 const Rdar12755044_foo_anon *radar12755044_anon() {
    689   static const Rdar12755044_foo_anon Rdar12755044_foo_list[] = { { { } } };
    690   return Rdar12755044_foo_list; // no-warning
    691 }
    692 
    693 const Rdar12755044_foo *radar12755044() {
    694   static const Rdar12755044_foo Rdar12755044_foo_list[] = { { { } } };
    695   return Rdar12755044_foo_list; // no-warning
    696 }
    697 
    698 // Test the correct handling of integer to bool conversions.  Previously
    699 // this resulted in a false positive because integers were being truncated
    700 // and not tested for non-zero.
    701 void rdar12759044() {
    702   int flag = 512;
    703   if (!(flag & 512)) {
    704    int *p = 0;
    705    *p = 0xDEADBEEF; // no-warning
    706   }
    707 }
    708 
    709 // The analyzer currently does not model complex types.  Test that the load
    710 // from 'x' is not flagged as being uninitialized.
    711 typedef __complex__ float _ComplexT;
    712 void rdar12964481(_ComplexT *y) {
    713    _ComplexT x;
    714    __real__ x = 1.0;
    715    __imag__ x = 1.0;
    716    *y *= x; // no-warning
    717 }
    718 void rdar12964481_b(_ComplexT *y) {
    719    _ComplexT x;
    720    // Eventually this should be a warning.
    721    *y *= x; // no-warning
    722 }
    723 
    724 // Test case for PR 12921.  This previously produced
    725 // a bogus warning.
    726 static const int pr12921_arr[] = { 0, 1 };
    727 static const int pr12921_arrcount = sizeof(pr12921_arr)/sizeof(int);
    728 
    729 int pr12921(int argc, char **argv) {
    730   int i, retval;
    731   for (i = 0; i < pr12921_arrcount; i++) {
    732     if (argc == i) {
    733       retval = i;
    734       break;
    735     }
    736   }
    737 
    738   // No match
    739   if (i == pr12921_arrcount) return 66;
    740   return pr12921_arr[retval];
    741 }
    742 
    743