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