[cfe-commits] r160760 - in /cfe/trunk: lib/StaticAnalyzer/Core/ExprEngineC.cpp test/Analysis/misc-ps.c
Ted Kremenek
kremenek at apple.com
Wed Jul 25 14:58:25 PDT 2012
Author: kremenek
Date: Wed Jul 25 16:58:25 2012
New Revision: 160760
URL: http://llvm.org/viewvc/llvm-project?rev=160760&view=rev
Log:
Update ExprEngine's handling of ternary operators to find the ternary expression
value by scanning the path, rather than assuming we have visited the '?:' operator
as a terminator (which sets a value indicating which expression to grab the
final ternary expression value from).
Modified:
cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineC.cpp
cfe/trunk/test/Analysis/misc-ps.c
Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineC.cpp?rev=160760&r1=160759&r2=160760&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineC.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineC.cpp Wed Jul 25 16:58:25 2012
@@ -590,17 +590,27 @@
ExplodedNode *Pred,
ExplodedNodeSet &Dst) {
StmtNodeBuilder B(Pred, Dst, *currentBuilderContext);
-
ProgramStateRef state = Pred->getState();
const LocationContext *LCtx = Pred->getLocationContext();
- SVal X = state->getSVal(Ex, LCtx);
- assert (X.isUndef());
- const Expr *SE = (Expr*) cast<UndefinedVal>(X).getData();
- assert(SE);
- X = state->getSVal(SE, LCtx);
-
- // Make sure that we invalidate the previous binding.
- B.generateNode(Ex, Pred, state->BindExpr(Ex, LCtx, X, true));
+
+ // Assume that the last CFGElement visited is the value of
+ // the guarded expression.
+ ExplodedNode *N = Pred;
+ SVal V;
+ while (N) {
+ ProgramPoint P = N->getLocation();
+ if (const PostStmt *PS = dyn_cast<PostStmt>(&P)) {
+ const Expr *Ex = cast<Expr>(PS->getStmt());
+ V = state->getSVal(Ex, LCtx);
+ break;
+ }
+ assert(N->pred_size() == 1);
+ N = *N->pred_begin();
+ }
+ assert(N);
+
+ // Generate a new node with the binding from the appropriate path.
+ B.generateNode(Ex, Pred, state->BindExpr(Ex, LCtx, V, true));
}
void ExprEngine::
Modified: cfe/trunk/test/Analysis/misc-ps.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/misc-ps.c?rev=160760&r1=160759&r2=160760&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/misc-ps.c (original)
+++ cfe/trunk/test/Analysis/misc-ps.c Wed Jul 25 16:58:25 2012
@@ -126,3 +126,10 @@
}
}
+// This example tests CFG handling of '||' nested in a ternary expression,
+// and seeing that the analyzer doesn't crash.
+int isctype(char c, unsigned long f)
+{
+ return (c < 1 || c > 10) ? 0 : !!(c & f);
+}
+
More information about the cfe-commits
mailing list