Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -std=c++11 -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 
     43 int pr10372(void *& x) {
     44   // GNU null is a pointer-sized integer, not a pointer.
     45   x = __null;
     46   // This used to crash.
     47   return __null;
     48 }
     49 
     50