[cfe-commits] r91987 - in /cfe/trunk: include/clang/Analysis/PathSensitive/GRExprEngine.h lib/Analysis/CFG.cpp lib/Analysis/GRExprEngine.cpp test/Analysis/misc-ps-region-store.cpp
Douglas Gregor
dgregor at apple.com
Tue Dec 22 23:32:32 PST 2009
While, switch, and for statements also have condition variables.
Sent from my iPhone
On Dec 22, 2009, at 8:49 PM, Ted Kremenek <kremenek at apple.com> wrote:
> Author: kremenek
> Date: Tue Dec 22 22:49:01 2009
> New Revision: 91987
>
> URL: http://llvm.org/viewvc/llvm-project?rev=91987&view=rev
> Log:
> Add CFG support for the condition variable that can appear in
> IfStmts in C++ mode.
> Add transfer function support in GRExprEngine for IfStmts with
> initialized condition variables.
>
> Modified:
> cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
> cfe/trunk/lib/Analysis/CFG.cpp
> cfe/trunk/lib/Analysis/GRExprEngine.cpp
> cfe/trunk/test/Analysis/misc-ps-region-store.cpp
>
> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/
> GRExprEngine.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h?rev=91987&r1=91986&r2=91987&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
> (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
> Tue Dec 22 22:49:01 2009
> @@ -293,6 +293,11 @@
> void VisitGuardedExpr(Expr* Ex, Expr* L, Expr* R, ExplodedNode*
> Pred,
> ExplodedNodeSet& Dst);
>
> + /// VisitIfStmtCondInit - Transfer function for handling the
> initialization
> + /// of a condition variable in an IfStmt.
> + void VisitIfStmtCondInit(IfStmt *IS, ExplodedNode *Pred,
> + ExplodedNodeSet& Dst);
> +
> void VisitInitListExpr(InitListExpr* E, ExplodedNode* Pred,
> ExplodedNodeSet& Dst);
>
>
> Modified: cfe/trunk/lib/Analysis/CFG.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=91987&r1=91986&r2=91987&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- cfe/trunk/lib/Analysis/CFG.cpp (original)
> +++ cfe/trunk/lib/Analysis/CFG.cpp Tue Dec 22 22:49:01 2009
> @@ -776,7 +776,19 @@
> // Add the condition as the last statement in the new block. This
> may create
> // new blocks as the condition may contain control-flow. Any
> newly created
> // blocks will be pointed to be "Block".
> - return addStmt(I->getCond());
> + Block = addStmt(I->getCond());
> +
> + // Finally, if the IfStmt contains a condition variable, add both
> the IfStmt
> + // and the condition variable initialization to the CFG.
> + if (VarDecl *VD = I->getConditionVariable()) {
> + if (Expr *Init = VD->getInit()) {
> + autoCreateBlock();
> + AppendStmt(Block, I, AddStmtChoice::AlwaysAdd);
> + addStmt(Init);
> + }
> + }
> +
> + return Block;
> }
>
>
>
> Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=91987&r1=91986&r2=91987&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
> +++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Tue Dec 22 22:49:01 2009
> @@ -661,6 +661,12 @@
> VisitCast(C, C->getSubExpr(), Pred, Dst, false);
> break;
> }
> +
> + case Stmt::IfStmtClass:
> + // This case isn't for branch processing, but for handling the
> + // initialization of a condition variable.
> + VisitIfStmtCondInit(cast<IfStmt>(S), Pred, Dst);
> + break;
>
> case Stmt::InitListExprClass:
> VisitInitListExpr(cast<InitListExpr>(S), Pred, Dst);
> @@ -749,6 +755,7 @@
> Ex->getLocStart(),
> "Error evaluating statement");
>
> +
> Ex = Ex->IgnoreParens();
>
> if (Ex != CurrentStmt && Pred->getLocationContext()->getCFG()-
> >isBlkExpr(Ex)){
> @@ -2223,6 +2230,36 @@
> }
> }
>
> +void GRExprEngine::VisitIfStmtCondInit(IfStmt *IS, ExplodedNode
> *Pred,
> + ExplodedNodeSet& Dst) {
> +
> + VarDecl* VD = IS->getConditionVariable();
> + Expr* InitEx = VD->getInit();
> +
> + ExplodedNodeSet Tmp;
> + Visit(InitEx, Pred, Tmp);
> +
> + for (ExplodedNodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; +
> +I) {
> + ExplodedNode *N = *I;
> + const GRState *state = GetState(N);
> +
> + const LocationContext *LC = N->getLocationContext();
> + SVal InitVal = state->getSVal(InitEx);
> + QualType T = VD->getType();
> +
> + // Recover some path-sensitivity if a scalar value evaluated to
> + // UnknownVal.
> + if (InitVal.isUnknown() ||
> + !getConstraintManager().canReasonAbout(InitVal)) {
> + InitVal = ValMgr.getConjuredSymbolVal(NULL, InitEx,
> + Builder-
> >getCurrentBlockCount());
> + }
> +
> + EvalBind(Dst, IS, IS, N, state,
> + loc::MemRegionVal(state->getRegion(VD, LC)), InitVal,
> true);
> + }
> +}
> +
> namespace {
> // This class is used by VisitInitListExpr as an item in a worklist
> // for processing the values contained in an InitListExpr.
>
> Modified: cfe/trunk/test/Analysis/misc-ps-region-store.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/misc-ps-region-store.cpp?rev=91987&r1=91986&r2=91987&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- cfe/trunk/test/Analysis/misc-ps-region-store.cpp (original)
> +++ cfe/trunk/test/Analysis/misc-ps-region-store.cpp Tue Dec 22
> 22:49:01 2009
> @@ -34,3 +34,10 @@
> return test3_aux(x);
> }
>
> +int test_init_in_condition_aux();
> +int test_init_in_condition() {
> + if (int x = test_init_in_condition_aux()) { // no-warning
> + return 1;
> + }
> + return 0;
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list