brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.1 KiB · 8456751 Raw
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