nullptr.cpp revision dd1d7d88f1fe6d7d7e79acaec3f83bc10d9f7b97
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
4void 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
10void 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
20void 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);  // expected-warning{{Access to field 'f' results in a dereference of a null pointer (loaded from variable 'np')}}
27
28  // Analysis stops at the first problem case, so we won't actually warn here.
29  *ip = 0;
30  *np = 0;
31}
32
33// nullptr is implemented as a zero integer value, so should be able to compare
34void foo4(void) {
35  char *np = nullptr;
36  if (np != 0)
37    *np = 0;  // no-warning
38  char  *cp = 0;
39  if (np != cp)
40    *np = 0;  // no-warning
41}
42
43int 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
50void zoo1() {
51  char **p = 0;
52  delete *(p + 0); // expected-warning{{Dereference of null pointer}}
53}
54
55void zoo2() {
56  int **a = 0;
57  int **b = 0;
58  asm ("nop"
59      :"=r"(*a)
60      :"0"(*b) // expected-warning{{Dereference of null pointer}}
61      );
62}
63
64int exprWithCleanups() {
65  struct S {
66    S(int a):a(a){}
67    ~S() {}
68
69    int a;
70  };
71
72  int *x = 0;
73  return S(*x).a; // expected-warning{{Dereference of null pointer}}
74}
75
76int materializeTempExpr() {
77  int *n = 0;
78  struct S {
79    int a;
80    S(int i): a(i) {}
81  };
82  const S &s = S(*n); // expected-warning{{Dereference of null pointer}}
83  return s.a;
84}
85