[analyzer] Remove recursive visitation in ExprEngine::VisitMemberExpr because it isn't needed anymore.
llvm-svn: 136513
This commit is contained in:
parent
db835cc213
commit
22a1e65532
|
|
@ -1350,42 +1350,36 @@ void ExprEngine::VisitLvalArraySubscriptExpr(const ArraySubscriptExpr* A,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// VisitMemberExpr - Transfer function for member expressions.
|
/// VisitMemberExpr - Transfer function for member expressions.
|
||||||
void ExprEngine::VisitMemberExpr(const MemberExpr* M, ExplodedNode* Pred,
|
void ExprEngine::VisitMemberExpr(const MemberExpr* M, ExplodedNode *Pred,
|
||||||
ExplodedNodeSet& Dst) {
|
ExplodedNodeSet& Dst) {
|
||||||
|
|
||||||
Expr *baseExpr = M->getBase()->IgnoreParens();
|
|
||||||
ExplodedNodeSet dstBase;
|
|
||||||
Visit(baseExpr, Pred, dstBase);
|
|
||||||
|
|
||||||
FieldDecl *field = dyn_cast<FieldDecl>(M->getMemberDecl());
|
FieldDecl *field = dyn_cast<FieldDecl>(M->getMemberDecl());
|
||||||
if (!field) // FIXME: skipping member expressions for non-fields
|
if (!field) // FIXME: skipping member expressions for non-fields
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (ExplodedNodeSet::iterator I = dstBase.begin(), E = dstBase.end();
|
Expr *baseExpr = M->getBase()->IgnoreParens();
|
||||||
I != E; ++I) {
|
const GRState* state = GetState(Pred);
|
||||||
const GRState* state = GetState(*I);
|
SVal baseExprVal = state->getSVal(baseExpr);
|
||||||
SVal baseExprVal = state->getSVal(baseExpr);
|
if (isa<nonloc::LazyCompoundVal>(baseExprVal) ||
|
||||||
if (isa<nonloc::LazyCompoundVal>(baseExprVal) ||
|
isa<nonloc::CompoundVal>(baseExprVal) ||
|
||||||
isa<nonloc::CompoundVal>(baseExprVal) ||
|
// FIXME: This can originate by conjuring a symbol for an unknown
|
||||||
// FIXME: This can originate by conjuring a symbol for an unknown
|
// temporary struct object, see test/Analysis/fields.c:
|
||||||
// temporary struct object, see test/Analysis/fields.c:
|
// (p = getit()).x
|
||||||
// (p = getit()).x
|
isa<nonloc::SymbolVal>(baseExprVal)) {
|
||||||
isa<nonloc::SymbolVal>(baseExprVal)) {
|
MakeNode(Dst, M, Pred, state->BindExpr(M, UnknownVal()));
|
||||||
MakeNode(Dst, M, *I, state->BindExpr(M, UnknownVal()));
|
return;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: Should we insert some assumption logic in here to determine
|
|
||||||
// if "Base" is a valid piece of memory? Before we put this assumption
|
|
||||||
// later when using FieldOffset lvals (which we no longer have).
|
|
||||||
|
|
||||||
// For all other cases, compute an lvalue.
|
|
||||||
SVal L = state->getLValue(field, baseExprVal);
|
|
||||||
if (M->isLValue())
|
|
||||||
MakeNode(Dst, M, *I, state->BindExpr(M, L), ProgramPoint::PostLValueKind);
|
|
||||||
else
|
|
||||||
evalLoad(Dst, M, *I, state, L);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: Should we insert some assumption logic in here to determine
|
||||||
|
// if "Base" is a valid piece of memory? Before we put this assumption
|
||||||
|
// later when using FieldOffset lvals (which we no longer have).
|
||||||
|
|
||||||
|
// For all other cases, compute an lvalue.
|
||||||
|
SVal L = state->getLValue(field, baseExprVal);
|
||||||
|
if (M->isLValue())
|
||||||
|
MakeNode(Dst, M, Pred, state->BindExpr(M, L), ProgramPoint::PostLValueKind);
|
||||||
|
else
|
||||||
|
evalLoad(Dst, M, Pred, state, L);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// evalBind - Handle the semantics of binding a value to a specific location.
|
/// evalBind - Handle the semantics of binding a value to a specific location.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue