blob: 80ef5fbf6d05b231b8e632794c272ded73d50e25 [file] [log] [blame]
David Blaikie95187bd2012-03-15 04:50:32 +00001// RUN: %clang_cc1 -std=c++11 -Wno-conversion-null -analyze -analyzer-checker=core -analyzer-store region -verify %s
Ted Kremeneke970c602011-04-22 18:01:30 +00002
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
Jordan Rosedd1d7d82012-09-22 01:24:33 +000026 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;
Ted Kremeneke970c602011-04-22 18:01:30 +000031}
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
Jordy Rose8f084262011-07-15 20:29:02 +000043int 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
Erik Verbruggen4fafeb62012-02-29 08:42:57 +000050void zoo1() {
51 char **p = 0;
52 delete *(p + 0); // expected-warning{{Dereference of null pointer}}
53}
Erik Verbruggena81d3d42012-03-04 18:12:21 +000054
55void zoo2() {
56 int **a = 0;
57 int **b = 0;
58 asm ("nop"
Simon Atanasyand95e95e2012-05-22 11:03:10 +000059 :"=r"(*a)
Erik Verbruggena81d3d42012-03-04 18:12:21 +000060 :"0"(*b) // expected-warning{{Dereference of null pointer}}
61 );
62}
Erik Verbruggene711d7e2012-03-14 18:01:43 +000063
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}