834 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,optin.cplusplus.UninitializedObject \2// RUN: -analyzer-config optin.cplusplus.UninitializedObject:Pedantic=true -DPEDANTIC \3// RUN: -analyzer-config optin.cplusplus.UninitializedObject:CheckPointeeInitialization=true \4// RUN: -std=c++11 -verify %s5 6//===----------------------------------------------------------------------===//7// Non-polymorphic inheritance tests8//===----------------------------------------------------------------------===//9 10class NonPolymorphicLeft1 {11 int x;12 13protected:14 int y;15 16public:17 NonPolymorphicLeft1() = default;18 NonPolymorphicLeft1(int) : x(1) {}19};20 21class NonPolymorphicInheritanceTest1 : public NonPolymorphicLeft1 {22 int z;23 24public:25 NonPolymorphicInheritanceTest1()26 : NonPolymorphicLeft1(int{}) {27 y = 2;28 z = 3;29 // All good!30 }31};32 33void fNonPolymorphicInheritanceTest1() {34 NonPolymorphicInheritanceTest1();35}36 37class NonPolymorphicBaseClass2 {38 int x; // expected-note{{uninitialized field 'this->NonPolymorphicBaseClass2::x'}}39protected:40 int y;41 42public:43 NonPolymorphicBaseClass2() = default;44 NonPolymorphicBaseClass2(int) : x(4) {}45};46 47class NonPolymorphicInheritanceTest2 : public NonPolymorphicBaseClass2 {48 int z;49 50public:51 NonPolymorphicInheritanceTest2() {52 y = 5;53 z = 6; // expected-warning{{1 uninitialized field}}54 }55};56 57void fNonPolymorphicInheritanceTest2() {58 NonPolymorphicInheritanceTest2();59}60 61class NonPolymorphicBaseClass3 {62 int x;63 64protected:65 int y; // expected-note{{uninitialized field 'this->NonPolymorphicBaseClass3::y'}}66public:67 NonPolymorphicBaseClass3() = default;68 NonPolymorphicBaseClass3(int) : x(7) {}69};70 71class NonPolymorphicInheritanceTest3 : public NonPolymorphicBaseClass3 {72 int z;73 74public:75 NonPolymorphicInheritanceTest3()76 : NonPolymorphicBaseClass3(int{}) {77 z = 8; // expected-warning{{1 uninitialized field}}78 }79};80 81void fNonPolymorphicInheritanceTest3() {82 NonPolymorphicInheritanceTest3();83}84 85class NonPolymorphicBaseClass4 {86 int x;87 88protected:89 int y;90 91public:92 NonPolymorphicBaseClass4() = default;93 NonPolymorphicBaseClass4(int) : x(9) {}94};95 96class NonPolymorphicInheritanceTest4 : public NonPolymorphicBaseClass4 {97 int z; // expected-note{{uninitialized field 'this->z'}}98 99public:100 NonPolymorphicInheritanceTest4()101 : NonPolymorphicBaseClass4(int{}) {102 y = 10; // expected-warning{{1 uninitialized field}}103 }104};105 106void fNonPolymorphicInheritanceTest4() {107 NonPolymorphicInheritanceTest4();108}109 110//===----------------------------------------------------------------------===//111// Polymorphic inheritance tests112//===----------------------------------------------------------------------===//113 114class PolymorphicLeft1 {115 int x;116 117protected:118 int y;119 120public:121 virtual ~PolymorphicLeft1() = default;122 PolymorphicLeft1() = default;123 PolymorphicLeft1(int) : x(11) {}124};125 126class PolymorphicInheritanceTest1 : public PolymorphicLeft1 {127 int z;128 129public:130 PolymorphicInheritanceTest1()131 : PolymorphicLeft1(int{}) {132 y = 12;133 z = 13;134 // All good!135 }136};137 138void fPolymorphicInheritanceTest1() {139 PolymorphicInheritanceTest1();140}141 142class PolymorphicRight1 {143 int x; // expected-note{{uninitialized field 'this->PolymorphicRight1::x'}}144protected:145 int y;146 147public:148 virtual ~PolymorphicRight1() = default;149 PolymorphicRight1() = default;150 PolymorphicRight1(int) : x(14) {}151};152 153class PolymorphicInheritanceTest2 : public PolymorphicRight1 {154 int z;155 156public:157 PolymorphicInheritanceTest2() {158 y = 15;159 z = 16; // expected-warning{{1 uninitialized field}}160 }161};162 163void fPolymorphicInheritanceTest2() {164 PolymorphicInheritanceTest2();165}166 167class PolymorphicBaseClass3 {168 int x;169 170protected:171 int y; // expected-note{{uninitialized field 'this->PolymorphicBaseClass3::y'}}172public:173 virtual ~PolymorphicBaseClass3() = default;174 PolymorphicBaseClass3() = default;175 PolymorphicBaseClass3(int) : x(17) {}176};177 178class PolymorphicInheritanceTest3 : public PolymorphicBaseClass3 {179 int z;180 181public:182 PolymorphicInheritanceTest3()183 : PolymorphicBaseClass3(int{}) {184 z = 18; // expected-warning{{1 uninitialized field}}185 }186};187 188void fPolymorphicInheritanceTest3() {189 PolymorphicInheritanceTest3();190}191 192class PolymorphicBaseClass4 {193 int x;194 195protected:196 int y;197 198public:199 virtual ~PolymorphicBaseClass4() = default;200 PolymorphicBaseClass4() = default;201 PolymorphicBaseClass4(int) : x(19) {}202};203 204class PolymorphicInheritanceTest4 : public PolymorphicBaseClass4 {205 int z; // expected-note{{uninitialized field 'this->z'}}206 207public:208 PolymorphicInheritanceTest4()209 : PolymorphicBaseClass4(int{}) {210 y = 20; // expected-warning{{1 uninitialized field}}211 }212};213 214void fPolymorphicInheritanceTest4() {215 PolymorphicInheritanceTest4();216}217 218//===----------------------------------------------------------------------===//219// Virtual inheritance tests220//===----------------------------------------------------------------------===//221 222class VirtualPolymorphicLeft1 {223 int x;224 225protected:226 int y;227 228public:229 virtual ~VirtualPolymorphicLeft1() = default;230 VirtualPolymorphicLeft1() = default;231 VirtualPolymorphicLeft1(int) : x(21) {}232};233 234class VirtualInheritanceTest1 : virtual public VirtualPolymorphicLeft1 {235 int z;236 237public:238 VirtualInheritanceTest1()239 : VirtualPolymorphicLeft1(int()) {240 y = 22;241 z = 23;242 // All good!243 }244};245 246void fVirtualInheritanceTest1() {247 VirtualInheritanceTest1();248}249 250class VirtualPolymorphicRight1 {251 int x; // expected-note{{uninitialized field 'this->VirtualPolymorphicRight1::x'}}252protected:253 int y;254 255public:256 virtual ~VirtualPolymorphicRight1() = default;257 VirtualPolymorphicRight1() = default;258 VirtualPolymorphicRight1(int) : x(24) {}259};260 261class VirtualInheritanceTest2 : virtual public VirtualPolymorphicRight1 {262 int z;263 264public:265 VirtualInheritanceTest2() {266 y = 25;267 z = 26; // expected-warning{{1 uninitialized field}}268 }269};270 271void fVirtualInheritanceTest2() {272 VirtualInheritanceTest2();273}274 275class VirtualPolymorphicBaseClass3 {276 int x;277 278protected:279 int y; // expected-note{{uninitialized field 'this->VirtualPolymorphicBaseClass3::y'}}280public:281 virtual ~VirtualPolymorphicBaseClass3() = default;282 VirtualPolymorphicBaseClass3() = default;283 VirtualPolymorphicBaseClass3(int) : x(27) {}284};285 286class VirtualInheritanceTest3 : virtual public VirtualPolymorphicBaseClass3 {287 int z;288 289public:290 VirtualInheritanceTest3()291 : VirtualPolymorphicBaseClass3(int{}) {292 z = 28; // expected-warning{{1 uninitialized field}}293 }294};295 296void fVirtualInheritanceTest3() {297 VirtualInheritanceTest3();298}299 300//===----------------------------------------------------------------------===//301// Multiple inheritance tests302//===----------------------------------------------------------------------===//303 304/*305 Left Right306 \ /307 \ /308 \ /309 MultipleInheritanceTest310*/311 312struct Left1 {313 int x;314 Left1() = default;315 Left1(int) : x(29) {}316};317struct Right1 {318 int y;319 Right1() = default;320 Right1(int) : y(30) {}321};322 323class MultipleInheritanceTest1 : public Left1, public Right1 {324 int z;325 326public:327 MultipleInheritanceTest1()328 : Left1(int{}),329 Right1(char{}) {330 z = 31;331 // All good!332 }333 334 MultipleInheritanceTest1(int)335 : Left1(int{}) {336 y = 32;337 z = 33;338 // All good!339 }340 341 MultipleInheritanceTest1(int, int)342 : Right1(char{}) {343 x = 34;344 z = 35;345 // All good!346 }347};348 349void fMultipleInheritanceTest1() {350 MultipleInheritanceTest1();351 MultipleInheritanceTest1(int());352 MultipleInheritanceTest1(int(), int());353}354 355struct Left2 {356 int x;357 Left2() = default;358 Left2(int) : x(36) {}359};360struct Right2 {361 int y; // expected-note{{uninitialized field 'this->Right2::y'}}362 Right2() = default;363 Right2(int) : y(37) {}364};365 366class MultipleInheritanceTest2 : public Left2, public Right2 {367 int z;368 369public:370 MultipleInheritanceTest2()371 : Left2(int{}) {372 z = 38; // expected-warning{{1 uninitialized field}}373 }374};375 376void fMultipleInheritanceTest2() {377 MultipleInheritanceTest2();378}379 380struct Left3 {381 int x; // expected-note{{uninitialized field 'this->Left3::x'}}382 Left3() = default;383 Left3(int) : x(39) {}384};385struct Right3 {386 int y;387 Right3() = default;388 Right3(int) : y(40) {}389};390 391class MultipleInheritanceTest3 : public Left3, public Right3 {392 int z;393 394public:395 MultipleInheritanceTest3()396 : Right3(char{}) {397 z = 41; // expected-warning{{1 uninitialized field}}398 }399};400 401void fMultipleInheritanceTest3() {402 MultipleInheritanceTest3();403}404 405struct Left4 {406 int x;407 Left4() = default;408 Left4(int) : x(42) {}409};410struct Right4 {411 int y;412 Right4() = default;413 Right4(int) : y(43) {}414};415 416class MultipleInheritanceTest4 : public Left4, public Right4 {417 int z; // expected-note{{uninitialized field 'this->z'}}418 419public:420 MultipleInheritanceTest4()421 : Left4(int{}),422 Right4(char{}) { // expected-warning{{1 uninitialized field}}423 }424};425 426void fMultipleInheritanceTest4() {427 MultipleInheritanceTest4();428}429 430struct Left5 {431 int x;432 Left5() = default;433 Left5(int) : x(44) {}434};435struct Right5 {436 int y; // expected-note{{uninitialized field 'this->Right5::y'}}437 Right5() = default;438 Right5(int) : y(45) {}439};440 441class MultipleInheritanceTest5 : public Left5, public Right5 {442 int z; // expected-note{{uninitialized field 'this->z'}}443 444public:445 MultipleInheritanceTest5() // expected-warning{{2 uninitialized fields}}446 : Left5(int{}) {447 }448};449 450void fMultipleInheritanceTest5() {451 MultipleInheritanceTest5();452}453 454//===----------------------------------------------------------------------===//455// Non-virtual diamond inheritance tests456//===----------------------------------------------------------------------===//457 458/*459 NonVirtualBase NonVirtualBase460 | |461 | |462 | |463 First Second464 \ /465 \ /466 \ /467 NonVirtualDiamondInheritanceTest468*/469 470struct NonVirtualBase1 {471 int x;472 NonVirtualBase1() = default;473 NonVirtualBase1(int) : x(46) {}474};475struct First1 : public NonVirtualBase1 {476 First1() = default;477 First1(int) : NonVirtualBase1(int{}) {}478};479struct Second1 : public NonVirtualBase1 {480 Second1() = default;481 Second1(int) : NonVirtualBase1(int{}) {}482};483 484class NonVirtualDiamondInheritanceTest1 : public First1, public Second1 {485 int z;486 487public:488 NonVirtualDiamondInheritanceTest1()489 : First1(int{}),490 Second1(int{}) {491 z = 47;492 // All good!493 }494 495 NonVirtualDiamondInheritanceTest1(int)496 : First1(int{}) {497 Second1::x = 48;498 z = 49;499 // All good!500 }501 502 NonVirtualDiamondInheritanceTest1(int, int)503 : Second1(int{}) {504 First1::x = 50;505 z = 51;506 // All good!507 }508};509 510void fNonVirtualDiamondInheritanceTest1() {511 NonVirtualDiamondInheritanceTest1();512 NonVirtualDiamondInheritanceTest1(int());513 NonVirtualDiamondInheritanceTest1(int(), int());514}515 516struct NonVirtualBase2 {517 int x; // expected-note{{uninitialized field 'this->NonVirtualBase2::x'}}518 NonVirtualBase2() = default;519 NonVirtualBase2(int) : x(52) {}520};521struct First2 : public NonVirtualBase2 {522 First2() = default;523 First2(int) : NonVirtualBase2(int{}) {}524};525struct Second2 : public NonVirtualBase2 {526 Second2() = default;527 Second2(int) : NonVirtualBase2(int{}) {}528};529 530class NonVirtualDiamondInheritanceTest2 : public First2, public Second2 {531 int z;532 533public:534 NonVirtualDiamondInheritanceTest2()535 : First2(int{}) {536 z = 53; // expected-warning{{1 uninitialized field}}537 }538};539 540void fNonVirtualDiamondInheritanceTest2() {541 NonVirtualDiamondInheritanceTest2();542}543 544struct NonVirtualBase3 {545 int x; // expected-note{{uninitialized field 'this->NonVirtualBase3::x'}}546 NonVirtualBase3() = default;547 NonVirtualBase3(int) : x(54) {}548};549struct First3 : public NonVirtualBase3 {550 First3() = default;551 First3(int) : NonVirtualBase3(int{}) {}552};553struct Second3 : public NonVirtualBase3 {554 Second3() = default;555 Second3(int) : NonVirtualBase3(int{}) {}556};557 558class NonVirtualDiamondInheritanceTest3 : public First3, public Second3 {559 int z;560 561public:562 NonVirtualDiamondInheritanceTest3()563 : Second3(int{}) {564 z = 55; // expected-warning{{1 uninitialized field}}565 }566};567 568void fNonVirtualDiamondInheritanceTest3() {569 NonVirtualDiamondInheritanceTest3();570}571 572struct NonVirtualBase4 {573 int x; // expected-note{{uninitialized field 'this->NonVirtualBase4::x'}}574 // expected-note@-1{{uninitialized field 'this->NonVirtualBase4::x'}}575 NonVirtualBase4() = default;576 NonVirtualBase4(int) : x(56) {}577};578struct First4 : public NonVirtualBase4 {579 First4() = default;580 First4(int) : NonVirtualBase4(int{}) {}581};582struct Second4 : public NonVirtualBase4 {583 Second4() = default;584 Second4(int) : NonVirtualBase4(int{}) {}585};586 587class NonVirtualDiamondInheritanceTest4 : public First4, public Second4 {588 int z;589 590public:591 NonVirtualDiamondInheritanceTest4() {592 z = 57; // expected-warning{{2 uninitialized fields}}593 }594};595 596void fNonVirtualDiamondInheritanceTest4() {597 NonVirtualDiamondInheritanceTest4();598}599 600struct NonVirtualBase5 {601 int x;602 NonVirtualBase5() = default;603 NonVirtualBase5(int) : x(58) {}604};605struct First5 : public NonVirtualBase5 {606 First5() = default;607 First5(int) : NonVirtualBase5(int{}) {}608};609struct Second5 : public NonVirtualBase5 {610 Second5() = default;611 Second5(int) : NonVirtualBase5(int{}) {}612};613 614class NonVirtualDiamondInheritanceTest5 : public First5, public Second5 {615 int z; // expected-note{{uninitialized field 'this->z'}}616 617public:618 NonVirtualDiamondInheritanceTest5()619 : First5(int{}),620 Second5(int{}) { // expected-warning{{1 uninitialized field}}621 }622};623 624void fNonVirtualDiamondInheritanceTest5() {625 NonVirtualDiamondInheritanceTest5();626}627 628struct NonVirtualBase6 {629 int x; // expected-note{{uninitialized field 'this->NonVirtualBase6::x'}}630 NonVirtualBase6() = default;631 NonVirtualBase6(int) : x(59) {}632};633struct First6 : public NonVirtualBase6 {634 First6() = default;635 First6(int) : NonVirtualBase6(int{}) {}636};637struct Second6 : public NonVirtualBase6 {638 Second6() = default;639 Second6(int) : NonVirtualBase6(int{}) {}640};641 642class NonVirtualDiamondInheritanceTest6 : public First6, public Second6 {643 int z; // expected-note{{uninitialized field 'this->z'}}644 645public:646 NonVirtualDiamondInheritanceTest6() // expected-warning{{2 uninitialized fields}}647 : First6(int{}) {648 // 'z' and 'Second::x' unintialized649 }650};651 652void fNonVirtualDiamondInheritanceTest6() {653 NonVirtualDiamondInheritanceTest6();654}655 656//===----------------------------------------------------------------------===//657// Virtual diamond inheritance tests658//===----------------------------------------------------------------------===//659 660/*661 VirtualBase662 / \663 / \664 / \665 VirtualFirst VirtualSecond666 \ /667 \ /668 \ /669 VirtualDiamondInheritanceTest670*/671 672struct VirtualBase1 {673 int x;674 VirtualBase1() = default;675 VirtualBase1(int) : x(60) {}676};677struct VirtualFirst1 : virtual public VirtualBase1 {678 VirtualFirst1() = default;679 VirtualFirst1(int) : VirtualBase1(int{}) {}680 VirtualFirst1(int, int) { x = 61; }681};682struct VirtualSecond1 : virtual public VirtualBase1 {683 VirtualSecond1() = default;684 VirtualSecond1(int) : VirtualBase1(int{}) {}685 VirtualSecond1(int, int) { x = 62; }686};687 688class VirtualDiamondInheritanceTest1 : public VirtualFirst1, public VirtualSecond1 {689 690public:691 VirtualDiamondInheritanceTest1() {692 x = 0;693 // All good!694 }695 696 VirtualDiamondInheritanceTest1(int)697 : VirtualFirst1(int{}, int{}),698 VirtualSecond1(int{}, int{}) {699 // All good!700 }701 702 VirtualDiamondInheritanceTest1(int, int)703 : VirtualFirst1(int{}, int{}) {704 // All good!705 }706};707 708void fVirtualDiamondInheritanceTest1() {709 VirtualDiamondInheritanceTest1();710 VirtualDiamondInheritanceTest1(int());711 VirtualDiamondInheritanceTest1(int(), int());712}713 714struct VirtualBase2 {715 int x; // expected-note{{uninitialized field 'this->VirtualBase2::x'}}716 VirtualBase2() = default;717 VirtualBase2(int) : x(63) {}718};719struct VirtualFirst2 : virtual public VirtualBase2 {720 VirtualFirst2() = default;721 VirtualFirst2(int) : VirtualBase2(int{}) {}722 VirtualFirst2(int, int) { x = 64; }723};724struct VirtualSecond2 : virtual public VirtualBase2 {725 VirtualSecond2() = default;726 VirtualSecond2(int) : VirtualBase2(int{}) {}727 VirtualSecond2(int, int) { x = 65; }728};729 730class VirtualDiamondInheritanceTest2 : public VirtualFirst2, public VirtualSecond2 {731 732public:733 VirtualDiamondInheritanceTest2() // expected-warning{{1 uninitialized field}}734 : VirtualFirst2(int{}) {735 // From the N4659 C++ Standard Working Draft:736 //737 // (15.6.2.7)738 // [...] A 'mem-initializer' where the 'mem-initializer-id' denotes a739 // virtual base class is ignored during execution of a constructor of any740 // class that is not the most derived class.741 //742 // This means that Left1::x will not be initialized, because in both743 // VirtualFirst::VirtualFirst(int) and VirtualSecond::VirtualSecond(int)744 // the constructor delegation to Left1::Left1(int) will be745 // ignored.746 }747};748 749void fVirtualDiamondInheritanceTest2() {750 VirtualDiamondInheritanceTest2();751}752 753struct VirtualBase3 {754 int x; // expected-note{{uninitialized field 'this->VirtualBase3::x'}}755 VirtualBase3() = default;756 VirtualBase3(int) : x(66) {}757};758struct VirtualFirst3 : virtual public VirtualBase3 {759 VirtualFirst3() = default;760 VirtualFirst3(int) : VirtualBase3(int{}) {}761 VirtualFirst3(int, int) { x = 67; }762};763struct VirtualSecond3 : virtual public VirtualBase3 {764 VirtualSecond3() = default;765 VirtualSecond3(int) : VirtualBase3(int{}) {}766 VirtualSecond3(int, int) { x = 68; }767};768 769class VirtualDiamondInheritanceTest3 : public VirtualFirst3, public VirtualSecond3 {770 771public:772 VirtualDiamondInheritanceTest3() // expected-warning{{1 uninitialized field}}773 : VirtualFirst3(int{}) {}774};775 776void fVirtualDiamondInheritanceTest3() {777 VirtualDiamondInheritanceTest3();778}779 780//===----------------------------------------------------------------------===//781// Dynamic type test.782//===----------------------------------------------------------------------===//783 784struct DynTBase1 {};785struct DynTDerived1 : DynTBase1 {786 int y; // expected-note{{uninitialized field 'static_cast<DynTDerived1 *>(this->bptr)->y'}}787};788 789struct DynamicTypeTest1 {790 DynTBase1 *bptr;791 int i = 0;792 793 DynamicTypeTest1(DynTBase1 *bptr) : bptr(bptr) {} // expected-warning{{1 uninitialized field}}794};795 796void fDynamicTypeTest1() {797 DynTDerived1 d;798 DynamicTypeTest1 t(&d);799};800 801struct DynTBase2 {802 int x; // expected-note{{uninitialized field 'static_cast<DynTDerived2 *>(this->bptr)->DynTBase2::x'}}803};804struct DynTDerived2 : DynTBase2 {805 int y; // expected-note{{uninitialized field 'static_cast<DynTDerived2 *>(this->bptr)->y'}}806};807 808struct DynamicTypeTest2 {809 DynTBase2 *bptr;810 int i = 0;811 812 DynamicTypeTest2(DynTBase2 *bptr) : bptr(bptr) {} // expected-warning{{2 uninitialized fields}}813};814 815void fDynamicTypeTest2() {816 DynTDerived2 d;817 DynamicTypeTest2 t(&d);818}819 820struct SymbolicSuperRegionBase {821 SymbolicSuperRegionBase() {}822};823 824struct SymbolicSuperRegionDerived : SymbolicSuperRegionBase {825 SymbolicSuperRegionBase *bptr; // no-crash826 SymbolicSuperRegionDerived(SymbolicSuperRegionBase *bptr) : bptr(bptr) {}827};828 829SymbolicSuperRegionDerived *getSymbolicRegion();830 831void fSymbolicSuperRegionTest() {832 SymbolicSuperRegionDerived test(getSymbolicRegion());833}834