Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -std=c++11 -Wno-conversion-null -analyze -analyzer-checker=core -analyzer-store region -verify %s
      2 
      3 // test to see if nullptr is detected as a null pointer
      4 void foo1(void) {
      5   char  *np = nullptr;
      6   *np = 0;  // expected-warning{{Dereference of null pointer}}
      7 }
      8 
      9 // check if comparing nullptr to nullptr is detected properly
     10 void foo2(void) {
     11   char *np1 = nullptr;
     12   char *np2 = np1;
     13   char c;
     14   if (np1 == np2)
     15     np1 = &c;
     16   *np1 = 0;  // no-warning
     17 }
     18 
     19 // invoving a nullptr in a more complex operation should be cause a warning
     20 void foo3(void) {
     21   struct foo {
     22     int a, f;
     23   };
     24   char *np = nullptr;
     25   // casting a nullptr to anything should be caught eventually
     26   int *ip = &(((struct foo *)np)->f);
     27   *ip = 0;  // expected-warning{{Dereference of null pointer}}
     28   // should be error here too, but analysis gets stopped
     29 //  *np = 0;
     30 }
     31 
     32 // nullptr is implemented as a zero integer value, so should be able to compare
     33 void foo4(void) {
     34   char *np = nullptr;
     35   if (np != 0)
     36     *np = 0;  // no-warning
     37   char  *cp = 0;
     38   if (np != cp)
     39     *np = 0;  // no-warning
     40 }
     41 
     42 int pr10372(void *& x) {
     43   // GNU null is a pointer-sized integer, not a pointer.
     44   x = __null;
     45   // This used to crash.
     46   return __null;
     47 }
     48 
     49 void zoo1() {
     50   char **p = 0;
     51   delete *(p + 0); // expected-warning{{Dereference of null pointer}}
     52 }
     53 
     54 void zoo2() {
     55   int **a = 0;
     56   int **b = 0;
     57   asm ("nop"
     58       :"=r"(*a)
     59       :"0"(*b) // expected-warning{{Dereference of null pointer}}
     60       );
     61 }
     62 
     63 int exprWithCleanups() {
     64   struct S {
     65     S(int a):a(a){}
     66     ~S() {}
     67 
     68     int a;
     69   };
     70 
     71   int *x = 0;
     72   return S(*x).a; // expected-warning{{Dereference of null pointer}}
     73 }
     74 
     75 int materializeTempExpr() {
     76   int *n = 0;
     77   struct S {
     78     int a;
     79     S(int i): a(i) {}
     80   };
     81   const S &s = S(*n); // expected-warning{{Dereference of null pointer}}
     82   return s.a;
     83 }
     84 
     85 typedef decltype(nullptr) nullptr_t;
     86 void testMaterializeTemporaryExprWithNullPtr() {
     87   // Create MaterializeTemporaryExpr with a nullptr inside.
     88   const nullptr_t &r = nullptr;
     89 }
     90