// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-output=text -std=c++11 -verify %s // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-output=text -std=c++17 -verify %s #include "Inputs/system-header-simulator-cxx.h" namespace copyMoveTrackCtor { struct S { int *p1, *p2; S(int *a, int *b) : p1(a), p2(b) {} // expected-note{{Null pointer value stored to 's.p1'}} }; void CtorDirect() { int *x = nullptr, *y = nullptr; // expected-note@-1{{'x' initialized to a null pointer value}} S s(x, y); // expected-note@-1{{Passing null pointer value via 1st parameter 'a'}} // expected-note@-2{{Calling constructor for 'S'}} // expected-note@-3{{Returning from constructor for 'S'}} // expected-note@-4{{'s' initialized here}} S s2 = s; // expected-note{{Null pointer value stored to 's2.p1'}} // expected-note@-1{{'s2' initialized here}} S s3 = s2; // expected-note{{Null pointer value stored to 's3.p1'}} // expected-note@-1{{'s3' initialized here}} S s4 = std::move(s3); // expected-note{{Null pointer value stored to 's4.p1'}} // expected-note@-1{{'s4' initialized here}} S s5 = s4; // expected-note{{Null pointer value stored to 's5.p1'}} int i = *s5.p1; // expected-warning{{Dereference of null pointer}} // expected-note@-1{{Dereference of null pointer (loaded from field 'p1')}} (void) i; } } // namespace copyMoveTrackCtor namespace copyMoveTrackInitList { struct S { int *p1, *p2; }; void InitListDirect() { int *x = nullptr, *y = nullptr; //expected-note{{'x' initialized to a null pointer value}} S s{x, y}; //expected-note{{'s.p1' initialized to a null pointer value}} //expected-note@-1{{'s' initialized here}} S s2 = s; // expected-note{{Null pointer value stored to 's2.p1'}} // expected-note@-1{{'s2' initialized here}} S s3 = s2; // expected-note{{Null pointer value stored to 's3.p1'}} // expected-note@-1{{'s3' initialized here}} S s4 = std::move(s3); // expected-note{{Null pointer value stored to 's4.p1'}} // expected-note@-1{{'s4' initialized here}} S s5 = s4; // expected-note{{Null pointer value stored to 's5.p1'}} int i = *s5.p1; // expected-warning{{Dereference of null pointer}} // expected-note@-1{{Dereference of null pointer (loaded from field 'p1')}} (void) i; } void InitListAssign() { int *x = nullptr, *y = nullptr; //expected-note{{'x' initialized to a null pointer value}} S s = {x, y}; //expected-note{{'s.p1' initialized to a null pointer value}} //expected-note@-1{{'s' initialized here}} S s2 = s; // expected-note{{Null pointer value stored to 's2.p1'}} // expected-note@-1{{'s2' initialized here}} S s3 = s2; // expected-note{{Null pointer value stored to 's3.p1'}} // expected-note@-1{{'s3' initialized here}} S s4 = std::move(s3); // expected-note{{Null pointer value stored to 's4.p1'}} // expected-note@-1{{'s4' initialized here}} S s5 = s4; // expected-note{{Null pointer value stored to 's5.p1'}} int i = *s5.p1; // expected-warning{{Dereference of null pointer}} // expected-note@-1{{Dereference of null pointer (loaded from field 'p1')}} (void) i; } } // namespace copyMoveTrackInitList namespace copyMoveTrackCtorMemberInitList { struct S { int *p1, *p2; S(int *a, int *b) : p1{a}, p2{b} {} // expected-note{{Null pointer value stored to 's.p1'}} }; void CtorDirect() { int *x = nullptr, *y = nullptr; // expected-note@-1{{'x' initialized to a null pointer value}} S s{x, y}; // expected-note@-1{{Passing null pointer value via 1st parameter 'a'}} // expected-note@-2{{Calling constructor for 'S'}} // expected-note@-3{{Returning from constructor for 'S'}} // expected-note@-4{{'s' initialized here}} S s2 = s; // expected-note{{Null pointer value stored to 's2.p1'}} // expected-note@-1{{'s2' initialized here}} S s3 = s2; // expected-note{{Null pointer value stored to 's3.p1'}} // expected-note@-1{{'s3' initialized here}} S s4 = std::move(s3); // expected-note{{Null pointer value stored to 's4.p1'}} // expected-note@-1{{'s4' initialized here}} S s5 = s4; // expected-note{{Null pointer value stored to 's5.p1'}} int i = *s5.p1; // expected-warning{{Dereference of null pointer}} // expected-note@-1{{Dereference of null pointer (loaded from field 'p1')}} (void) i; } } // namespace copyMoveTrackCtorMemberInitList namespace directInitList { struct S { int *p1, *p2; }; void InitListDirect() { int *x = nullptr, *y = nullptr; //expected-note{{'y' initialized to a null pointer value}} S s{x, y}; //expected-note{{'s.p2' initialized to a null pointer value}} int i = *s.p2; // expected-warning{{Dereference of null pointer}} // expected-note@-1{{Dereference of null pointer}} (void) i; } } // namespace directInitList namespace directNestedInitList { struct S2 { int *p1, *p2; }; struct S { S2 s; }; void InitListNestedDirect() { int *x = nullptr, *y = nullptr; //expected-note{{'y' initialized to a null pointer value}} //FIXME: Put more information to the notes. S s{x, y}; //expected-note{{'s.s.p2' initialized to a null pointer value}} int i = *s.s.p2; // expected-warning{{Dereference of null pointer}} // expected-note@-1{{Dereference of null pointer}} (void) i; } } // namespace directNestedInitList #if __cplusplus >= 201703L namespace structuredBinding { struct S { int *p1, *p2; }; void StructuredBinding() { int *x = nullptr, *y = nullptr; //expected-note@-1{{'y' initialized to a null pointer value}} S s{x, y}; //expected-note@-1{{'s.p2' initialized to a null pointer value}} //expected-note@-2{{'s' initialized here}} auto [a, b] = s; //expected-note{{Null pointer value stored to '.p2'}} int i = *b; // expected-warning{{Dereference of null pointer}} // expected-note@-1{{Dereference of null pointer}} (void) i; } } // namespace structuredBinding #endif namespace nestedCtorInitializer { struct S5{ int *x, *y; }; struct S4 { S5 s5; }; struct S3 { S4 s4; }; struct S2 { S3 s3; }; struct S { S2 s2; //FIXME: Put more information to the notes. S(int *x, int *y) : s2{x, y} {}; // expected-note@-1{{Null pointer value stored to 's.s2.s3.s4.s5.y'}} }; void nestedCtorInit(){ int *x = nullptr, *y = nullptr; // expected-note{{'y' initialized to a null pointer value}} S s{x,y}; // expected-note@-1{{Passing null pointer value via 2nd parameter}} // expected-note@-2{{Calling constructor for 'S'}} // expected-note@-3{{Returning from constructor for 'S'}} int i = *s.s2.s3.s4.s5.y; // expected-warning{{Dereference of null pointer}} // expected-note@-1{{Dereference of null pointer}} (void) i; } } // namespace nestedCtorInitializer namespace NestedRegionTrack { struct N { int *e; }; struct S { N y; }; void NestedRegionTrack() { int *x = nullptr, *y = nullptr; // expected-note@-1{{'y' initialized to a null pointer value}} // Test for nested single element initializer list here. S a{{{{{{{{y}}}}}}}}; // expected-note@-1{{'a.y.e' initialized to a null pointer value}} // expected-note@-2{{'a' initialized here}} // expected-warning@-3{{too many braces around scalar initializer}} // expected-warning@-4{{too many braces around scalar initializer}} // expected-warning@-5{{too many braces around scalar initializer}} // expected-warning@-6{{too many braces around scalar initializer}} // expected-warning@-7{{too many braces around scalar initializer}} S b = a; // expected-note{{Null pointer value stored to 'b.y.e'}} int i = *b.y.e; // expected-warning@-1{{Dereference of null pointer}} // expected-note@-2{{Dereference of null pointer}} (void) i; (void) x; } } // namespace NestedRegionTrack namespace NestedElementRegionTrack { struct N { int *arr[2]; }; struct S { N n; }; void NestedElementRegionTrack() { int *x = nullptr, *y = nullptr; // expected-note@-1{{'y' initialized to a null pointer value}} S a{{x, y}}; // expected-note@-1{{Initializing to a null pointer value}} // expected-note@-2{{'a' initialized here}} S b = a; // expected-note{{Storing null pointer value}} int i = *b.n.arr[1]; // expected-warning@-1{{Dereference of null pointer}} // expected-note@-2{{Dereference of null pointer}} (void) i; } } // namespace NestedElementRegionTrack