// 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