[analyzer] Add PostStmt callback for ArraySubscriptExpr
A patch by Jan Smets! Differential Revision: https://reviews.llvm.org/D25009 llvm-svn: 283253
This commit is contained in:
parent
bfdbea6481
commit
fb859a934a
|
@ -25,7 +25,9 @@ using namespace ento;
|
|||
namespace {
|
||||
|
||||
class AnalysisOrderChecker : public Checker< check::PreStmt<CastExpr>,
|
||||
check::PostStmt<CastExpr>> {
|
||||
check::PostStmt<CastExpr>,
|
||||
check::PreStmt<ArraySubscriptExpr>,
|
||||
check::PostStmt<ArraySubscriptExpr>> {
|
||||
bool isCallbackEnabled(CheckerContext &C, StringRef CallbackName) const {
|
||||
AnalyzerOptions &Opts = C.getAnalysisManager().getAnalyzerOptions();
|
||||
return Opts.getBooleanOption("*", false, this) ||
|
||||
|
@ -44,6 +46,16 @@ public:
|
|||
llvm::errs() << "PostStmt<CastExpr> (Kind : " << CE->getCastKindName()
|
||||
<< ")\n";
|
||||
}
|
||||
|
||||
void checkPreStmt(const ArraySubscriptExpr *SubExpr, CheckerContext &C) const {
|
||||
if (isCallbackEnabled(C, "PreStmtArraySubscriptExpr"))
|
||||
llvm::errs() << "PreStmt<ArraySubscriptExpr>\n";
|
||||
}
|
||||
|
||||
void checkPostStmt(const ArraySubscriptExpr *SubExpr, CheckerContext &C) const {
|
||||
if (isCallbackEnabled(C, "PostStmtArraySubscriptExpr"))
|
||||
llvm::errs() << "PostStmt<ArraySubscriptExpr>\n";
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -1968,24 +1968,26 @@ void ExprEngine::VisitLvalArraySubscriptExpr(const ArraySubscriptExpr *A,
|
|||
const Expr *Base = A->getBase()->IgnoreParens();
|
||||
const Expr *Idx = A->getIdx()->IgnoreParens();
|
||||
|
||||
ExplodedNodeSet checkerPreStmt;
|
||||
getCheckerManager().runCheckersForPreStmt(checkerPreStmt, Pred, A, *this);
|
||||
ExplodedNodeSet CheckerPreStmt;
|
||||
getCheckerManager().runCheckersForPreStmt(CheckerPreStmt, Pred, A, *this);
|
||||
|
||||
StmtNodeBuilder Bldr(checkerPreStmt, Dst, *currBldrCtx);
|
||||
ExplodedNodeSet EvalSet;
|
||||
StmtNodeBuilder Bldr(CheckerPreStmt, EvalSet, *currBldrCtx);
|
||||
assert(A->isGLValue() ||
|
||||
(!AMgr.getLangOpts().CPlusPlus &&
|
||||
A->getType().isCForbiddenLValueType()));
|
||||
|
||||
for (ExplodedNodeSet::iterator it = checkerPreStmt.begin(),
|
||||
ei = checkerPreStmt.end(); it != ei; ++it) {
|
||||
const LocationContext *LCtx = (*it)->getLocationContext();
|
||||
ProgramStateRef state = (*it)->getState();
|
||||
for (auto *Node : CheckerPreStmt) {
|
||||
const LocationContext *LCtx = Node->getLocationContext();
|
||||
ProgramStateRef state = Node->getState();
|
||||
SVal V = state->getLValue(A->getType(),
|
||||
state->getSVal(Idx, LCtx),
|
||||
state->getSVal(Base, LCtx));
|
||||
Bldr.generateNode(A, *it, state->BindExpr(A, LCtx, V), nullptr,
|
||||
Bldr.generateNode(A, Node, state->BindExpr(A, LCtx, V), nullptr,
|
||||
ProgramPoint::PostLValueKind);
|
||||
}
|
||||
|
||||
getCheckerManager().runCheckersForPostStmt(Dst, EvalSet, A, *this);
|
||||
}
|
||||
|
||||
/// VisitMemberExpr - Transfer function for member expressions.
|
||||
|
|
Loading…
Reference in New Issue