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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while (R->getAs<CXXBaseObjectRegion>()) {
|
||||||
|
NeedsCastBack = true;
|
||||||
|
|
||||||
|
if (!isa<TypedValueRegion>(R->getSuperRegion()))
|
||||||
|
break;
|
||||||
|
R = R->getSuperRegion()->getAs<TypedValueRegion>();
|
||||||
|
}
|
||||||
|
|
||||||
return std::make_pair(R, NeedsCastBack);
|
return std::make_pair(R, NeedsCastBack);
|
||||||
}
|
}
|
||||||
|
|
|
@ -781,21 +781,53 @@ void fVirtualDiamondInheritanceTest3() {
|
||||||
// Dynamic type test.
|
// Dynamic type test.
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
struct DynTBase {};
|
struct DynTBase1 {};
|
||||||
struct DynTDerived : DynTBase {
|
struct DynTDerived1 : DynTBase1 {
|
||||||
// TODO: we'd expect the note: {{uninitialized field 'this->x'}}
|
int y; // expected-note{{uninitialized field 'static_cast<struct DynTDerived1 *>(this->bptr)->y'}}
|
||||||
int x; // no-note
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DynamicTypeTest {
|
struct DynamicTypeTest1 {
|
||||||
DynTBase *bptr;
|
DynTBase1 *bptr;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
// TODO: we'd expect the warning: {{1 uninitialized field}}
|
DynamicTypeTest1(DynTBase1 *bptr) : bptr(bptr) {} // expected-warning{{1 uninitialized field}}
|
||||||
DynamicTypeTest(DynTBase *bptr) : bptr(bptr) {} // no-warning
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void f() {
|
void fDynamicTypeTest1() {
|
||||||
DynTDerived d;
|
DynTDerived1 d;
|
||||||
DynamicTypeTest t(&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