зеркало из https://github.com/microsoft/clang-1.git
Invalidate a field of struct type by setting its default value to conjured
symbol. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74408 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
87453d1c39
Коммит
6bd8a521aa
|
@ -2863,14 +2863,25 @@ void CFRefCount::EvalSummary(ExplodedNodeSet<GRState>& Dst,
|
|||
// For now just handle scalar fields.
|
||||
FieldDecl *FD = *FI;
|
||||
QualType FT = FD->getType();
|
||||
|
||||
const FieldRegion* FR = MRMgr.getFieldRegion(FD, R);
|
||||
|
||||
if (Loc::IsLocType(FT) ||
|
||||
(FT->isIntegerType() && FT->isScalarType())) {
|
||||
const FieldRegion* FR = MRMgr.getFieldRegion(FD, R);
|
||||
|
||||
SVal V = ValMgr.getConjuredSymbolVal(*I, FT, Count);
|
||||
state = state->bindLoc(ValMgr.makeLoc(FR), V);
|
||||
}
|
||||
}
|
||||
else if (FT->isStructureType()) {
|
||||
// set the default value of the struct field to conjured
|
||||
// symbol. Note that the type of the symbol is irrelavant.
|
||||
// We cannot use the type of the struct otherwise ValMgr won't
|
||||
// give us the conjured symbol.
|
||||
StoreManager& StoreMgr =
|
||||
Eng.getStateManager().getStoreManager();
|
||||
SVal V = ValMgr.getConjuredSymbolVal(*I,
|
||||
Eng.getContext().IntTy,
|
||||
Count);
|
||||
state = StoreMgr.setDefaultValue(state, FR, V);
|
||||
}
|
||||
}
|
||||
} else if (const ArrayType *AT = Ctx.getAsArrayType(T)) {
|
||||
// Set the default value of the array to conjured symbol.
|
||||
|
|
|
@ -157,3 +157,14 @@ struct s3 p[1];
|
|||
void f16(struct s3 *p) {
|
||||
struct s3 a = *((struct s3*) ((char*) &p[0]));
|
||||
}
|
||||
|
||||
void inv(struct s1 *);
|
||||
|
||||
// Invalidate the struct field.
|
||||
void f17() {
|
||||
struct s1 t;
|
||||
int x;
|
||||
inv(&t);
|
||||
if (t.e.d)
|
||||
x = 1;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче