1*a11e51e9Sisuckatcs // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-output=text -std=c++11 -verify %s
2*a11e51e9Sisuckatcs // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-output=text -std=c++17 -verify %s
3*a11e51e9Sisuckatcs
4*a11e51e9Sisuckatcs #include "Inputs/system-header-simulator-cxx.h"
5*a11e51e9Sisuckatcs
6*a11e51e9Sisuckatcs namespace copyMoveTrackCtor {
7*a11e51e9Sisuckatcs struct S {
8*a11e51e9Sisuckatcs int *p1, *p2;
ScopyMoveTrackCtor::S9*a11e51e9Sisuckatcs S(int *a, int *b) : p1(a), p2(b) {} // expected-note{{Null pointer value stored to 's.p1'}}
10*a11e51e9Sisuckatcs };
11*a11e51e9Sisuckatcs
CtorDirect()12*a11e51e9Sisuckatcs void CtorDirect() {
13*a11e51e9Sisuckatcs int *x = nullptr, *y = nullptr;
14*a11e51e9Sisuckatcs // expected-note@-1{{'x' initialized to a null pointer value}}
15*a11e51e9Sisuckatcs
16*a11e51e9Sisuckatcs S s(x, y);
17*a11e51e9Sisuckatcs // expected-note@-1{{Passing null pointer value via 1st parameter 'a'}}
18*a11e51e9Sisuckatcs // expected-note@-2{{Calling constructor for 'S'}}
19*a11e51e9Sisuckatcs // expected-note@-3{{Returning from constructor for 'S'}}
20*a11e51e9Sisuckatcs // expected-note@-4{{'s' initialized here}}
21*a11e51e9Sisuckatcs S s2 = s; // expected-note{{Null pointer value stored to 's2.p1'}}
22*a11e51e9Sisuckatcs // expected-note@-1{{'s2' initialized here}}
23*a11e51e9Sisuckatcs S s3 = s2; // expected-note{{Null pointer value stored to 's3.p1'}}
24*a11e51e9Sisuckatcs // expected-note@-1{{'s3' initialized here}}
25*a11e51e9Sisuckatcs S s4 = std::move(s3); // expected-note{{Null pointer value stored to 's4.p1'}}
26*a11e51e9Sisuckatcs // expected-note@-1{{'s4' initialized here}}
27*a11e51e9Sisuckatcs S s5 = s4; // expected-note{{Null pointer value stored to 's5.p1'}}
28*a11e51e9Sisuckatcs
29*a11e51e9Sisuckatcs int i = *s5.p1; // expected-warning{{Dereference of null pointer}}
30*a11e51e9Sisuckatcs // expected-note@-1{{Dereference of null pointer (loaded from field 'p1')}}
31*a11e51e9Sisuckatcs
32*a11e51e9Sisuckatcs (void) i;
33*a11e51e9Sisuckatcs }
34*a11e51e9Sisuckatcs } // namespace copyMoveTrackCtor
35*a11e51e9Sisuckatcs
36*a11e51e9Sisuckatcs namespace copyMoveTrackInitList {
37*a11e51e9Sisuckatcs struct S {
38*a11e51e9Sisuckatcs int *p1, *p2;
39*a11e51e9Sisuckatcs };
40*a11e51e9Sisuckatcs
InitListDirect()41*a11e51e9Sisuckatcs void InitListDirect() {
42*a11e51e9Sisuckatcs int *x = nullptr, *y = nullptr; //expected-note{{'x' initialized to a null pointer value}}
43*a11e51e9Sisuckatcs
44*a11e51e9Sisuckatcs S s{x, y}; //expected-note{{'s.p1' initialized to a null pointer value}}
45*a11e51e9Sisuckatcs //expected-note@-1{{'s' initialized here}}
46*a11e51e9Sisuckatcs S s2 = s; // expected-note{{Null pointer value stored to 's2.p1'}}
47*a11e51e9Sisuckatcs // expected-note@-1{{'s2' initialized here}}
48*a11e51e9Sisuckatcs S s3 = s2; // expected-note{{Null pointer value stored to 's3.p1'}}
49*a11e51e9Sisuckatcs // expected-note@-1{{'s3' initialized here}}
50*a11e51e9Sisuckatcs S s4 = std::move(s3); // expected-note{{Null pointer value stored to 's4.p1'}}
51*a11e51e9Sisuckatcs // expected-note@-1{{'s4' initialized here}}
52*a11e51e9Sisuckatcs S s5 = s4; // expected-note{{Null pointer value stored to 's5.p1'}}
53*a11e51e9Sisuckatcs
54*a11e51e9Sisuckatcs int i = *s5.p1; // expected-warning{{Dereference of null pointer}}
55*a11e51e9Sisuckatcs // expected-note@-1{{Dereference of null pointer (loaded from field 'p1')}}
56*a11e51e9Sisuckatcs
57*a11e51e9Sisuckatcs (void) i;
58*a11e51e9Sisuckatcs }
59*a11e51e9Sisuckatcs
InitListAssign()60*a11e51e9Sisuckatcs void InitListAssign() {
61*a11e51e9Sisuckatcs int *x = nullptr, *y = nullptr; //expected-note{{'x' initialized to a null pointer value}}
62*a11e51e9Sisuckatcs
63*a11e51e9Sisuckatcs S s = {x, y}; //expected-note{{'s.p1' initialized to a null pointer value}}
64*a11e51e9Sisuckatcs //expected-note@-1{{'s' initialized here}}
65*a11e51e9Sisuckatcs S s2 = s; // expected-note{{Null pointer value stored to 's2.p1'}}
66*a11e51e9Sisuckatcs // expected-note@-1{{'s2' initialized here}}
67*a11e51e9Sisuckatcs S s3 = s2; // expected-note{{Null pointer value stored to 's3.p1'}}
68*a11e51e9Sisuckatcs // expected-note@-1{{'s3' initialized here}}
69*a11e51e9Sisuckatcs S s4 = std::move(s3); // expected-note{{Null pointer value stored to 's4.p1'}}
70*a11e51e9Sisuckatcs // expected-note@-1{{'s4' initialized here}}
71*a11e51e9Sisuckatcs S s5 = s4; // expected-note{{Null pointer value stored to 's5.p1'}}
72*a11e51e9Sisuckatcs
73*a11e51e9Sisuckatcs int i = *s5.p1; // expected-warning{{Dereference of null pointer}}
74*a11e51e9Sisuckatcs // expected-note@-1{{Dereference of null pointer (loaded from field 'p1')}}
75*a11e51e9Sisuckatcs
76*a11e51e9Sisuckatcs (void) i;
77*a11e51e9Sisuckatcs }
78*a11e51e9Sisuckatcs
79*a11e51e9Sisuckatcs } // namespace copyMoveTrackInitList
80*a11e51e9Sisuckatcs
81*a11e51e9Sisuckatcs namespace copyMoveTrackCtorMemberInitList {
82*a11e51e9Sisuckatcs struct S {
83*a11e51e9Sisuckatcs int *p1, *p2;
ScopyMoveTrackCtorMemberInitList::S84*a11e51e9Sisuckatcs S(int *a, int *b) : p1{a}, p2{b} {} // expected-note{{Null pointer value stored to 's.p1'}}
85*a11e51e9Sisuckatcs };
86*a11e51e9Sisuckatcs
CtorDirect()87*a11e51e9Sisuckatcs void CtorDirect() {
88*a11e51e9Sisuckatcs int *x = nullptr, *y = nullptr;
89*a11e51e9Sisuckatcs // expected-note@-1{{'x' initialized to a null pointer value}}
90*a11e51e9Sisuckatcs
91*a11e51e9Sisuckatcs S s{x, y};
92*a11e51e9Sisuckatcs // expected-note@-1{{Passing null pointer value via 1st parameter 'a'}}
93*a11e51e9Sisuckatcs // expected-note@-2{{Calling constructor for 'S'}}
94*a11e51e9Sisuckatcs // expected-note@-3{{Returning from constructor for 'S'}}
95*a11e51e9Sisuckatcs // expected-note@-4{{'s' initialized here}}
96*a11e51e9Sisuckatcs S s2 = s; // expected-note{{Null pointer value stored to 's2.p1'}}
97*a11e51e9Sisuckatcs // expected-note@-1{{'s2' initialized here}}
98*a11e51e9Sisuckatcs S s3 = s2; // expected-note{{Null pointer value stored to 's3.p1'}}
99*a11e51e9Sisuckatcs // expected-note@-1{{'s3' initialized here}}
100*a11e51e9Sisuckatcs S s4 = std::move(s3); // expected-note{{Null pointer value stored to 's4.p1'}}
101*a11e51e9Sisuckatcs // expected-note@-1{{'s4' initialized here}}
102*a11e51e9Sisuckatcs S s5 = s4; // expected-note{{Null pointer value stored to 's5.p1'}}
103*a11e51e9Sisuckatcs
104*a11e51e9Sisuckatcs int i = *s5.p1; // expected-warning{{Dereference of null pointer}}
105*a11e51e9Sisuckatcs // expected-note@-1{{Dereference of null pointer (loaded from field 'p1')}}
106*a11e51e9Sisuckatcs
107*a11e51e9Sisuckatcs (void) i;
108*a11e51e9Sisuckatcs }
109*a11e51e9Sisuckatcs } // namespace copyMoveTrackCtorMemberInitList
110*a11e51e9Sisuckatcs
111*a11e51e9Sisuckatcs namespace directInitList {
112*a11e51e9Sisuckatcs struct S {
113*a11e51e9Sisuckatcs int *p1, *p2;
114*a11e51e9Sisuckatcs };
115*a11e51e9Sisuckatcs
InitListDirect()116*a11e51e9Sisuckatcs void InitListDirect() {
117*a11e51e9Sisuckatcs int *x = nullptr, *y = nullptr; //expected-note{{'y' initialized to a null pointer value}}
118*a11e51e9Sisuckatcs
119*a11e51e9Sisuckatcs S s{x, y}; //expected-note{{'s.p2' initialized to a null pointer value}}
120*a11e51e9Sisuckatcs
121*a11e51e9Sisuckatcs int i = *s.p2; // expected-warning{{Dereference of null pointer}}
122*a11e51e9Sisuckatcs // expected-note@-1{{Dereference of null pointer}}
123*a11e51e9Sisuckatcs (void) i;
124*a11e51e9Sisuckatcs }
125*a11e51e9Sisuckatcs } // namespace directInitList
126*a11e51e9Sisuckatcs
127*a11e51e9Sisuckatcs namespace directNestedInitList {
128*a11e51e9Sisuckatcs struct S2 {
129*a11e51e9Sisuckatcs int *p1, *p2;
130*a11e51e9Sisuckatcs };
131*a11e51e9Sisuckatcs
132*a11e51e9Sisuckatcs struct S {
133*a11e51e9Sisuckatcs S2 s;
134*a11e51e9Sisuckatcs };
135*a11e51e9Sisuckatcs
InitListNestedDirect()136*a11e51e9Sisuckatcs void InitListNestedDirect() {
137*a11e51e9Sisuckatcs int *x = nullptr, *y = nullptr; //expected-note{{'y' initialized to a null pointer value}}
138*a11e51e9Sisuckatcs
139*a11e51e9Sisuckatcs //FIXME: Put more information to the notes.
140*a11e51e9Sisuckatcs S s{x, y}; //expected-note{{'s.s.p2' initialized to a null pointer value}}
141*a11e51e9Sisuckatcs
142*a11e51e9Sisuckatcs int i = *s.s.p2; // expected-warning{{Dereference of null pointer}}
143*a11e51e9Sisuckatcs // expected-note@-1{{Dereference of null pointer}}
144*a11e51e9Sisuckatcs (void) i;
145*a11e51e9Sisuckatcs }
146*a11e51e9Sisuckatcs } // namespace directNestedInitList
147*a11e51e9Sisuckatcs
148*a11e51e9Sisuckatcs #if __cplusplus >= 201703L
149*a11e51e9Sisuckatcs
150*a11e51e9Sisuckatcs namespace structuredBinding {
151*a11e51e9Sisuckatcs struct S {
152*a11e51e9Sisuckatcs int *p1, *p2;
153*a11e51e9Sisuckatcs };
154*a11e51e9Sisuckatcs
StructuredBinding()155*a11e51e9Sisuckatcs void StructuredBinding() {
156*a11e51e9Sisuckatcs int *x = nullptr, *y = nullptr;
157*a11e51e9Sisuckatcs //expected-note@-1{{'y' initialized to a null pointer value}}
158*a11e51e9Sisuckatcs
159*a11e51e9Sisuckatcs S s{x, y};
160*a11e51e9Sisuckatcs //expected-note@-1{{'s.p2' initialized to a null pointer value}}
161*a11e51e9Sisuckatcs //expected-note@-2{{'s' initialized here}}
162*a11e51e9Sisuckatcs
163*a11e51e9Sisuckatcs auto [a, b] = s; //expected-note{{Null pointer value stored to '.p2'}}
164*a11e51e9Sisuckatcs
165*a11e51e9Sisuckatcs int i = *b; // expected-warning{{Dereference of null pointer}}
166*a11e51e9Sisuckatcs // expected-note@-1{{Dereference of null pointer}}
167*a11e51e9Sisuckatcs (void) i;
168*a11e51e9Sisuckatcs }
169*a11e51e9Sisuckatcs } // namespace structuredBinding
170*a11e51e9Sisuckatcs
171*a11e51e9Sisuckatcs #endif
172*a11e51e9Sisuckatcs
173*a11e51e9Sisuckatcs namespace nestedCtorInitializer {
174*a11e51e9Sisuckatcs struct S5{
175*a11e51e9Sisuckatcs int *x, *y;
176*a11e51e9Sisuckatcs };
177*a11e51e9Sisuckatcs
178*a11e51e9Sisuckatcs struct S4 {
179*a11e51e9Sisuckatcs S5 s5;
180*a11e51e9Sisuckatcs };
181*a11e51e9Sisuckatcs
182*a11e51e9Sisuckatcs struct S3 {
183*a11e51e9Sisuckatcs S4 s4;
184*a11e51e9Sisuckatcs };
185*a11e51e9Sisuckatcs
186*a11e51e9Sisuckatcs struct S2 {
187*a11e51e9Sisuckatcs S3 s3;
188*a11e51e9Sisuckatcs };
189*a11e51e9Sisuckatcs
190*a11e51e9Sisuckatcs struct S {
191*a11e51e9Sisuckatcs S2 s2;
192*a11e51e9Sisuckatcs
193*a11e51e9Sisuckatcs //FIXME: Put more information to the notes.
SnestedCtorInitializer::S194*a11e51e9Sisuckatcs S(int *x, int *y) : s2{x, y} {};
195*a11e51e9Sisuckatcs // expected-note@-1{{Null pointer value stored to 's.s2.s3.s4.s5.y'}}
196*a11e51e9Sisuckatcs };
197*a11e51e9Sisuckatcs
nestedCtorInit()198*a11e51e9Sisuckatcs void nestedCtorInit(){
199*a11e51e9Sisuckatcs int *x = nullptr, *y = nullptr; // expected-note{{'y' initialized to a null pointer value}}
200*a11e51e9Sisuckatcs
201*a11e51e9Sisuckatcs S s{x,y};
202*a11e51e9Sisuckatcs // expected-note@-1{{Passing null pointer value via 2nd parameter}}
203*a11e51e9Sisuckatcs // expected-note@-2{{Calling constructor for 'S'}}
204*a11e51e9Sisuckatcs // expected-note@-3{{Returning from constructor for 'S'}}
205*a11e51e9Sisuckatcs
206*a11e51e9Sisuckatcs int i = *s.s2.s3.s4.s5.y; // expected-warning{{Dereference of null pointer}}
207*a11e51e9Sisuckatcs // expected-note@-1{{Dereference of null pointer}}
208*a11e51e9Sisuckatcs (void) i;
209*a11e51e9Sisuckatcs }
210*a11e51e9Sisuckatcs } // namespace nestedCtorInitializer
211*a11e51e9Sisuckatcs
212*a11e51e9Sisuckatcs namespace NestedRegionTrack {
213*a11e51e9Sisuckatcs struct N {
214*a11e51e9Sisuckatcs int *e;
215*a11e51e9Sisuckatcs };
216*a11e51e9Sisuckatcs
217*a11e51e9Sisuckatcs struct S {
218*a11e51e9Sisuckatcs N y;
219*a11e51e9Sisuckatcs };
220*a11e51e9Sisuckatcs
NestedRegionTrack()221*a11e51e9Sisuckatcs void NestedRegionTrack() {
222*a11e51e9Sisuckatcs int *x = nullptr, *y = nullptr;
223*a11e51e9Sisuckatcs // expected-note@-1{{'y' initialized to a null pointer value}}
224*a11e51e9Sisuckatcs
225*a11e51e9Sisuckatcs // Test for nested single element initializer list here.
226*a11e51e9Sisuckatcs S a{{{{{{{{y}}}}}}}};
227*a11e51e9Sisuckatcs // expected-note@-1{{'a.y.e' initialized to a null pointer value}}
228*a11e51e9Sisuckatcs // expected-note@-2{{'a' initialized here}}
229*a11e51e9Sisuckatcs // expected-warning@-3{{too many braces around scalar initializer}}
230*a11e51e9Sisuckatcs // expected-warning@-4{{too many braces around scalar initializer}}
231*a11e51e9Sisuckatcs // expected-warning@-5{{too many braces around scalar initializer}}
232*a11e51e9Sisuckatcs // expected-warning@-6{{too many braces around scalar initializer}}
233*a11e51e9Sisuckatcs // expected-warning@-7{{too many braces around scalar initializer}}
234*a11e51e9Sisuckatcs
235*a11e51e9Sisuckatcs S b = a; // expected-note{{Null pointer value stored to 'b.y.e'}}
236*a11e51e9Sisuckatcs
237*a11e51e9Sisuckatcs int i = *b.y.e;
238*a11e51e9Sisuckatcs // expected-warning@-1{{Dereference of null pointer}}
239*a11e51e9Sisuckatcs // expected-note@-2{{Dereference of null pointer}}
240*a11e51e9Sisuckatcs (void) i;
241*a11e51e9Sisuckatcs (void) x;
242*a11e51e9Sisuckatcs }
243*a11e51e9Sisuckatcs
244*a11e51e9Sisuckatcs } // namespace NestedRegionTrack
245*a11e51e9Sisuckatcs
246*a11e51e9Sisuckatcs namespace NestedElementRegionTrack {
247*a11e51e9Sisuckatcs struct N {
248*a11e51e9Sisuckatcs int *arr[2];
249*a11e51e9Sisuckatcs };
250*a11e51e9Sisuckatcs
251*a11e51e9Sisuckatcs struct S {
252*a11e51e9Sisuckatcs N n;
253*a11e51e9Sisuckatcs };
254*a11e51e9Sisuckatcs
NestedElementRegionTrack()255*a11e51e9Sisuckatcs void NestedElementRegionTrack() {
256*a11e51e9Sisuckatcs int *x = nullptr, *y = nullptr;
257*a11e51e9Sisuckatcs // expected-note@-1{{'y' initialized to a null pointer value}}
258*a11e51e9Sisuckatcs
259*a11e51e9Sisuckatcs S a{{x, y}};
260*a11e51e9Sisuckatcs // expected-note@-1{{Initializing to a null pointer value}}
261*a11e51e9Sisuckatcs // expected-note@-2{{'a' initialized here}}
262*a11e51e9Sisuckatcs
263*a11e51e9Sisuckatcs S b = a; // expected-note{{Storing null pointer value}}
264*a11e51e9Sisuckatcs
265*a11e51e9Sisuckatcs int i = *b.n.arr[1];
266*a11e51e9Sisuckatcs // expected-warning@-1{{Dereference of null pointer}}
267*a11e51e9Sisuckatcs // expected-note@-2{{Dereference of null pointer}}
268*a11e51e9Sisuckatcs (void) i;
269*a11e51e9Sisuckatcs }
270*a11e51e9Sisuckatcs
271*a11e51e9Sisuckatcs } // namespace NestedElementRegionTrack
272