From: Ted Kremenek Date: Tue, 16 Aug 2011 01:53:39 +0000 (+0000) Subject: [analyzer] add ExprEngine::getEagerlyAssumedTags() to allow externally querying of... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6c7511db998817e64f2e124013e7d7c9a430c580;p=clang [analyzer] add ExprEngine::getEagerlyAssumedTags() to allow externally querying of "eagerly assumed" expressions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@137704 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index b290ac4bd7..a7fb5b5709 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -380,6 +380,9 @@ public: /// with those assumptions. void evalEagerlyAssume(ExplodedNodeSet &Dst, ExplodedNodeSet &Src, const Expr *Ex); + + std::pair + getEagerlyAssumeTags(); SVal evalMinus(SVal X) { return X.isValid() ? svalBuilder.evalMinus(cast(X)) : X; diff --git a/lib/StaticAnalyzer/Core/ExprEngine.cpp b/lib/StaticAnalyzer/Core/ExprEngine.cpp index d55bddd0ea..1ea90047fa 100644 --- a/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1761,10 +1761,17 @@ void ExprEngine::VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *Ex, // Transfer function: Objective-C ivar references. //===----------------------------------------------------------------------===// +std::pair +ExprEngine::getEagerlyAssumeTags() { + static SimpleProgramPointTag + EagerlyAssumeTrue("ExprEngine : Eagerly Assume True"), + EagerlyAssumeFalse("ExprEngine : Eagerly Assume False"); + return std::make_pair(&EagerlyAssumeTrue, &EagerlyAssumeFalse); +} + void ExprEngine::evalEagerlyAssume(ExplodedNodeSet &Dst, ExplodedNodeSet &Src, const Expr *Ex) { - static SimpleProgramPointTag EagerlyAssumeTag("ExprEngine : Eagerly Assume"); for (ExplodedNodeSet::iterator I=Src.begin(), E=Src.end(); I!=E; ++I) { ExplodedNode *Pred = *I; @@ -1781,18 +1788,21 @@ void ExprEngine::evalEagerlyAssume(ExplodedNodeSet &Dst, ExplodedNodeSet &Src, const ProgramState *state = Pred->getState(); SVal V = state->getSVal(Ex); if (nonloc::SymExprVal *SEV = dyn_cast(&V)) { + const std::pair &tags = + getEagerlyAssumeTags(); + // First assume that the condition is true. - if (const ProgramState *stateTrue = state->assume(*SEV, true)) { + if (const ProgramState *StateTrue = state->assume(*SEV, true)) { SVal Val = svalBuilder.makeIntVal(1U, Ex->getType()); - stateTrue = stateTrue->BindExpr(Ex, Val); - Dst.Add(Builder->generateNode(Ex, stateTrue, Pred, &EagerlyAssumeTag)); + StateTrue = StateTrue->BindExpr(Ex, Val); + Dst.Add(Builder->generateNode(Ex, StateTrue, Pred, tags.first)); } // Next, assume that the condition is false. - if (const ProgramState *stateFalse = state->assume(*SEV, false)) { + if (const ProgramState *StateFalse = state->assume(*SEV, false)) { SVal Val = svalBuilder.makeIntVal(0U, Ex->getType()); - stateFalse = stateFalse->BindExpr(Ex, Val); - Dst.Add(Builder->generateNode(Ex, stateFalse, Pred, &EagerlyAssumeTag)); + StateFalse = StateFalse->BindExpr(Ex, Val); + Dst.Add(Builder->generateNode(Ex, StateFalse, Pred, tags.second)); } } else