mirror of https://github.com/microsoft/clang.git
[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:
parent
86a2b603b2
commit
fe266159d5
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue