nullptr.cpp revision a81d3d434e6581ff354eaf5b2a3c25c75771a792
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
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);
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
33void 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
42int 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
49void zoo1() {
50  char **p = 0;
51  delete *(p + 0); // expected-warning{{Dereference of null pointer}}
52}
53
54void zoo2() {
55  int **a = 0;
56  int **b = 0;
57  asm ("nop"
58      :"=a"(*a)
59      :"0"(*b) // expected-warning{{Dereference of null pointer}}
60      );
61}
62