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:
Zhongxing Xu 2009-06-28 13:59:24 +00:00
Родитель 87453d1c39
Коммит 6bd8a521aa
2 изменённых файлов: 26 добавлений и 4 удалений

Просмотреть файл

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