1 // RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config suppress-inlined-defensive-checks=true -verify %s
2 
3 // Perform inline defensive checks.
4 void idc(int *p) {
5 	if (p)
6 		;
7 }
8 
9 int test01(int *p) {
10   if (p)
11     ;
12   return *p; // expected-warning {{Dereference of null pointer}}
13 }
14 
15 int test02(int *p, int *x) {
16   if (p)
17     ;
18   idc(p);
19 	if (x)
20 		;
21   return *p; // expected-warning {{Dereference of null pointer}}
22 }
23 
24 int test03(int *p, int *x) {
25 	idc(p);
26 	if (p)
27 		;
28 	return *p; // False negative
29 }
30 
31 int deref04(int *p) {
32   return *p; // expected-warning {{Dereference of null pointer}}
33 }
34 
35 int test04(int *p) {
36   if (p)
37     ;
38   idc(p);
39   return deref04(p);
40 }
41 
42 int test11(int *q, int *x) {
43 	int *p = q;
44 	if (q)
45 		;
46 	if (x)
47 		;
48 	return *p; // expected-warning{{Dereference of null pointer}}
49 }
50 
51 int test12(int *q) {
52 	int *p = q;
53 	idc(q);
54 	return *p;
55 }
56 
57 int test13(int *q) {
58 	int *p = q;
59 	idc(p);
60 	return *p;
61 }
62 
63 int test21(int *q, int *x) {
64 	if (q)
65 		;
66 	if (x)
67 		;
68 	int *p = q;
69 	return *p; // expected-warning{{Dereference of null pointer}}
70 }
71 
72 int test22(int *q, int *x) {
73   idc(q);
74 	if (x)
75 		;
76 	int *p = q;
77 	return *p;
78 }
79 
80 int test23(int *q, int *x) {
81   idc(q);
82 	if (x)
83 		;
84 	int *p = q;
85   if (!p)
86     ;
87 	return *p; // False negative
88 }
89 
90 void use(char *p) {
91   if (!p)
92     return;
93   p[0] = 'a';
94 }
95 
96 void test24(char *buffer) {
97   use(buffer);
98   buffer[1] = 'b';
99 }
100 
101 // Ensure idc works on pointers with constant offset.
102 void idcchar(const char *s2) {
103   if(s2)
104     ;
105 }
106 void testConstantOffset(char *value) {
107   char *cursor = value + 5;
108   idcchar(cursor);
109   if (*cursor) {
110     cursor++;
111   }
112 }
113 
114 // Ensure idc works for integer zero values (ex: suppressed div by zero).
115 void idcZero(int assume) {
116   if (assume)
117     ;
118 }
119 
120 int idcTriggerZeroValue(int m) {
121   idcZero(m);
122   return 5/m; // no-warning
123 }
124 
125 int idcTriggerZeroValueThroughCall(int i) {
126   return 5/i; // no-warning
127 }
128 void idcTrackZeroValueThroughCall(int x) {
129   idcZero(x);
130   idcTriggerZeroValueThroughCall(x);
131 }
132 
133 int idcTriggerZeroThroughDoubleAssignemnt(int i) {
134   return 5/i; // no-warning
135 }
136 void idcTrackZeroThroughDoubleAssignemnt(int x) {
137   idcZero(x);
138   int y = x;
139   int z = y;
140   idcTriggerZeroValueThroughCall(z);
141 }
142