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