If the SymbolicRegion was cast to another type, use that type to create the

ElementRegion.

llvm-svn: 73754
This commit is contained in:
Zhongxing Xu 2009-06-19 04:51:14 +00:00
parent 707cbc4126
commit cc45762253
2 changed files with 18 additions and 3 deletions

View File

@ -749,9 +749,15 @@ SVal RegionStoreManager::EvalBinOp(const GRState *state,
// If the operand is a symbolic or alloca region, create the first element
// region on it.
if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(MR)) {
// Get symbol's type. It should be a pointer type.
SymbolRef Sym = SR->getSymbol();
QualType T = Sym->getType(getContext());
QualType T;
// If the SymbolicRegion was cast to another type, use that type.
if (const QualType *t = state->get<RegionCasts>(SR)) {
T = *t;
} else {
// Otherwise use the symbol's type.
SymbolRef Sym = SR->getSymbol();
T = Sym->getType(getContext());
}
QualType EleTy = T->getAsPointerType()->getPointeeType();
SVal ZeroIdx = ValMgr.makeZeroArrayIndex();

View File

@ -27,3 +27,12 @@ int f1(struct s **pval) {
char c = (unsigned char) *tbool; // Should use cast-to type to create symbol.
}
void f2(const char *str) {
unsigned char ch, cl, *p;
p = (unsigned char *)str;
ch = *p++; // use cast-to type 'unsigned char' to create element region.
cl = *p++;
if(!cl)
cl = 'a';
}