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