[analyzer][UninitializedObjectChecker] Correct dynamic type is acquired for record pointees

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


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@342217 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Kristof Umann 2018-09-14 09:13:36 +00:00
parent 86a2b603b2
commit fe266159d5
2 changed files with 51 additions and 11 deletions

View File

@ -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);
}

View File

@ -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());
}