Skip to content

Commit

Permalink
[analyzer][UninitializedObjectChecker] Correct dynamic type is acquir…
Browse files Browse the repository at this point in the history
…ed for record pointees

Differential Revision: https://reviews.llvm.org/D50892

llvm-svn: 342217
  • Loading branch information
Szelethus committed Sep 14, 2018
1 parent 5c3457d commit 3ef3dd7
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 11 deletions.
Expand Up @@ -234,5 +234,13 @@ static llvm::Optional<DereferenceInfo> dereference(ProgramStateRef State,
break;
}

while (R->getAs<CXXBaseObjectRegion>()) {
NeedsCastBack = true;

if (!isa<TypedValueRegion>(R->getSuperRegion()))
break;
R = R->getSuperRegion()->getAs<TypedValueRegion>();
}

return std::make_pair(R, NeedsCastBack);
}
54 changes: 43 additions & 11 deletions clang/test/Analysis/cxx-uninitialized-object-inheritance.cpp
Expand Up @@ -781,21 +781,53 @@ void fVirtualDiamondInheritanceTest3() {
// Dynamic type test.
//===----------------------------------------------------------------------===//

struct DynTBase {};
struct DynTDerived : DynTBase {
// TODO: we'd expect the note: {{uninitialized field 'this->x'}}
int x; // no-note
struct DynTBase1 {};
struct DynTDerived1 : DynTBase1 {
int y; // expected-note{{uninitialized field 'static_cast<struct DynTDerived1 *>(this->bptr)->y'}}
};

struct DynamicTypeTest {
DynTBase *bptr;
struct DynamicTypeTest1 {
DynTBase1 *bptr;
int i = 0;

// TODO: we'd expect the warning: {{1 uninitialized field}}
DynamicTypeTest(DynTBase *bptr) : bptr(bptr) {} // no-warning
DynamicTypeTest1(DynTBase1 *bptr) : bptr(bptr) {} // expected-warning{{1 uninitialized field}}
};

void f() {
DynTDerived d;
DynamicTypeTest t(&d);
void fDynamicTypeTest1() {
DynTDerived1 d;
DynamicTypeTest1 t(&d);
};

struct DynTBase2 {
int x; // expected-note{{uninitialized field 'static_cast<struct DynTDerived2 *>(this->bptr)->DynTBase2::x'}}
};
struct DynTDerived2 : DynTBase2 {
int y; // expected-note{{uninitialized field 'static_cast<struct DynTDerived2 *>(this->bptr)->y'}}
};

struct DynamicTypeTest2 {
DynTBase2 *bptr;
int i = 0;

DynamicTypeTest2(DynTBase2 *bptr) : bptr(bptr) {} // expected-warning{{2 uninitialized fields}}
};

void fDynamicTypeTest2() {
DynTDerived2 d;
DynamicTypeTest2 t(&d);
}

struct SymbolicSuperRegionBase {
SymbolicSuperRegionBase() {}
};

struct SymbolicSuperRegionDerived : SymbolicSuperRegionBase {
SymbolicSuperRegionBase *bptr; // no-crash
SymbolicSuperRegionDerived(SymbolicSuperRegionBase *bptr) : bptr(bptr) {}
};

SymbolicSuperRegionDerived *getSymbolicRegion();

void fSymbolicSuperRegionTest() {
SymbolicSuperRegionDerived test(getSymbolicRegion());
}

0 comments on commit 3ef3dd7

Please sign in to comment.