From: Ted Kremenek <kremenek@apple.com>
Date: Thu, 19 Feb 2009 18:18:48 +0000 (+0000)
Subject: retain/release checker: Fix crasher when the leak site is the same expression that... 
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b1dbf158db83b2b630621fa856a54c65d64e8632;p=clang

retain/release checker: Fix crasher when the leak site is the same expression that allocates an object.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65047 91177308-0d34-0410-b5e6-96231b3b80d8
---

diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp
index 939e20a02d..c86b960af1 100644
--- a/lib/Analysis/CFRefCount.cpp
+++ b/lib/Analysis/CFRefCount.cpp
@@ -2586,7 +2586,6 @@ CFRefLeakReport::getEndPath(BugReporter& br, const ExplodedNode<GRState>* EndN){
   
   while (LeakN) {
     ProgramPoint P = LeakN->getLocation();
-
     
     if (const PostStmt *PS = dyn_cast<PostStmt>(&P))
       S = PS->getStmt();
@@ -2597,18 +2596,27 @@ CFRefLeakReport::getEndPath(BugReporter& br, const ExplodedNode<GRState>* EndN){
       // Scan 'S' for uses of Sym.
       GRStateRef state(LeakN->getState(), BR.getStateManager());
       bool foundSymbol = false;
-    
-      for (Stmt::child_iterator I=S->child_begin(), E=S->child_end();
-            I!=E; ++I)
-        if (Expr *Ex = dyn_cast_or_null<Expr>(*I)) {
-          SVal X = state.GetSVal(Ex);
-          if (isa<loc::SymbolVal>(X) && 
-              cast<loc::SymbolVal>(X).getSymbol() == Sym){
-            foundSymbol = true;        
-            break;
+      
+      // First check if 'S' itself binds to the symbol.
+      if (Expr *Ex = dyn_cast<Expr>(S)) {
+        SVal X = state.GetSVal(Ex);
+        if (isa<loc::SymbolVal>(X) && 
+            cast<loc::SymbolVal>(X).getSymbol() == Sym)
+          foundSymbol = true;
+      }
+        
+      if (!foundSymbol)
+        for (Stmt::child_iterator I=S->child_begin(), E=S->child_end();
+             I!=E; ++I)
+          if (Expr *Ex = dyn_cast_or_null<Expr>(*I)) {
+            SVal X = state.GetSVal(Ex);
+            if (isa<loc::SymbolVal>(X) && 
+                cast<loc::SymbolVal>(X).getSymbol() == Sym){
+              foundSymbol = true;        
+              break;
+            }
           }
-        }
-
+      
       if (foundSymbol)
         break;
     }