]> granicus.if.org Git - clang/commitdiff
Fix diagnostic regression where the leak diagnostic could appear earlier in the path...
authorTed Kremenek <kremenek@apple.com>
Tue, 24 Feb 2009 23:30:57 +0000 (23:30 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 24 Feb 2009 23:30:57 +0000 (23:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65407 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CFRefCount.cpp

index 3a88877ba548a67348e726b4ed656f3022f81099..faf783941841c841c5cddbd9380c5d6faf03cd3e 100644 (file)
@@ -2698,12 +2698,18 @@ CFRefLeakReport::getEndPath(BugReporter& br, const ExplodedNode<GRState>* EndN){
   Stmt *S = 0;
   
   while (LeakN) {
+    bool atBranch = false;
     ProgramPoint P = LeakN->getLocation();
     
     if (const PostStmt *PS = dyn_cast<PostStmt>(&P))
       S = PS->getStmt();
-    else if (const BlockEdge *BE = dyn_cast<BlockEdge>(&P))
+    else if (const BlockEdge *BE = dyn_cast<BlockEdge>(&P)) {
+      // FIXME: What we really want is to set LeakN to be the node
+      // for the BlockEntrance for the branch we took and have BugReporter
+      // do the right thing.
+      atBranch = true;
       S = BE->getSrc()->getTerminator();
+    }
     
     if (S) {
       // Scan 'S' for uses of Sym.
@@ -2734,6 +2740,10 @@ CFRefLeakReport::getEndPath(BugReporter& br, const ExplodedNode<GRState>* EndN){
         break;
     }
     
+    // Don't traverse any higher than the branch.
+    if (atBranch)
+      break;
+    
     LeakN = LeakN->pred_empty() ? 0 : *(LeakN->pred_begin());
   }