[cfe-commits] r140956 - in /cfe/trunk: lib/Analysis/LiveVariables.cpp lib/StaticAnalyzer/Core/ExprEngineCXX.cpp test/Analysis/stack-addr-ps.cpp

Ted Kremenek kremenek at apple.com
Sat Oct 1 17:55:01 PDT 2011


Author: kremenek
Date: Sat Oct  1 19:54:48 2011
New Revision: 140956

URL: http://llvm.org/viewvc/llvm-project?rev=140956&view=rev
Log:
Fix LiveVariables analysis bug with MaterializeTemporaryExpr and fix handling in ExprEngine.  Fixes <rdar://problem/10201666>.

Modified:
    cfe/trunk/lib/Analysis/LiveVariables.cpp
    cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
    cfe/trunk/test/Analysis/stack-addr-ps.cpp

Modified: cfe/trunk/lib/Analysis/LiveVariables.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/LiveVariables.cpp?rev=140956&r1=140955&r2=140956&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/LiveVariables.cpp (original)
+++ cfe/trunk/lib/Analysis/LiveVariables.cpp Sat Oct  1 19:54:48 2011
@@ -372,10 +372,6 @@
       S = cast<CXXBindTemporaryExpr>(S)->getSubExpr();
       break;
     }
-    case Stmt::MaterializeTemporaryExprClass: {
-      S = cast<MaterializeTemporaryExpr>(S)->GetTemporaryExpr();
-      break;
-    }
     case Stmt::UnaryExprOrTypeTraitExprClass: {
       // No need to unconditionally visit subexpressions.
       return;

Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp?rev=140956&r1=140955&r2=140956&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp Sat Oct  1 19:54:48 2011
@@ -107,22 +107,19 @@
 void ExprEngine::CreateCXXTemporaryObject(const MaterializeTemporaryExpr *ME,
                                           ExplodedNode *Pred,
                                           ExplodedNodeSet &Dst) {
-  ExplodedNodeSet Tmp;
-  Visit(ME->GetTemporaryExpr(), Pred, Tmp);
-  for (ExplodedNodeSet::iterator I = Tmp.begin(), E = Tmp.end(); I != E; ++I) {
-    const ProgramState *state = (*I)->getState();
+  const Expr *tempExpr = ME->GetTemporaryExpr()->IgnoreParens();
+  const ProgramState *state = Pred->getState();
 
-    // Bind the temporary object to the value of the expression. Then bind
-    // the expression to the location of the object.
-    SVal V = state->getSVal(ME->GetTemporaryExpr());
-
-    const MemRegion *R =
-      svalBuilder.getRegionManager().getCXXTempObjectRegion(ME,
-                                                   Pred->getLocationContext());
+  // Bind the temporary object to the value of the expression. Then bind
+  // the expression to the location of the object.
+  SVal V = state->getSVal(tempExpr);
 
-    state = state->bindLoc(loc::MemRegionVal(R), V);
-    MakeNode(Dst, ME, Pred, state->BindExpr(ME, loc::MemRegionVal(R)));
-  }
+  const MemRegion *R =
+    svalBuilder.getRegionManager().getCXXTempObjectRegion(ME,
+                                                 Pred->getLocationContext());
+
+  state = state->bindLoc(loc::MemRegionVal(R), V);
+  MakeNode(Dst, ME, Pred, state->BindExpr(ME, loc::MemRegionVal(R)));
 }
 
 void ExprEngine::VisitCXXConstructExpr(const CXXConstructExpr *E, 

Modified: cfe/trunk/test/Analysis/stack-addr-ps.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/stack-addr-ps.cpp?rev=140956&r1=140955&r2=140956&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/stack-addr-ps.cpp (original)
+++ cfe/trunk/test/Analysis/stack-addr-ps.cpp Sat Oct  1 19:54:48 2011
@@ -50,7 +50,7 @@
 int *f3() {
   int x1;
   int *const &x2 = &x1; // expected-note {{binding reference variable 'x2' here}}
-  return x2; // expected-warning {{address of stack memory associated with local variable 'x1' returned}}
+  return x2; // expected-warning {{address of stack memory associated with local variable 'x1' returned}} expected-warning {{Address of stack memory associated with local variable 'x1' returned to caller}}
 }
 
 const int *f4() {





More information about the cfe-commits mailing list