]> granicus.if.org Git - clang/commitdiff
retain/release checker: Record the summary used to generate a given node.
authorTed Kremenek <kremenek@apple.com>
Wed, 18 Feb 2009 02:00:25 +0000 (02:00 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 18 Feb 2009 02:00:25 +0000 (02:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64876 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CFRefCount.cpp

index 81faf21653f619522201a8be10ed772b17ae6c81..8fea99b4f6a40e9619673a185c4ef13b0b01271b 100644 (file)
@@ -1284,6 +1284,7 @@ public:
 
 private:
   RetainSummaryManager Summaries;  
+  llvm::DenseMap<const GRExprEngine::NodeTy*, const RetainSummary*> SummaryLog;
   const LangOptions&   LOpts;
 
   BugType *useAfterRelease, *releaseNotOwned;
@@ -1655,11 +1656,15 @@ void CFRefCount::EvalSummary(ExplodedNodeSet<GRState>& Dst,
     }
   }
   
-  // Is this a sink?
-  if (IsEndPath(Summ))
-    Builder.MakeSinkNode(Dst, Ex, Pred, state);
-  else
-    Builder.MakeNode(Dst, Ex, Pred, state);
+  // Generate a sink node if we are at the end of a path.
+  GRExprEngine::NodeTy *NewNode =
+    IsEndPath(Summ) ? Builder.MakeSinkNode(Dst, Ex, Pred, state)
+                    : Builder.MakeNode(Dst, Ex, Pred, state);
+  
+  // Annotate the edge with summary we used.
+  // FIXME: This assumes that we always use the same summary when generating
+  //  this node.
+  if (NewNode) SummaryLog[NewNode] = Summ;
 }