]> granicus.if.org Git - clang/commitdiff
[analyzer] MallocChecker: address a diagnostic "fixme".
authorAnna Zaks <ganna@apple.com>
Thu, 9 Feb 2012 06:48:19 +0000 (06:48 +0000)
committerAnna Zaks <ganna@apple.com>
Thu, 9 Feb 2012 06:48:19 +0000 (06:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150158 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/MallocChecker.cpp

index 4a15afd986e0da4de179d310a25f6d27476ce6c4..7edc50d42f2e37a1b7567d2fb71e0016cd587b3b 100644 (file)
@@ -651,12 +651,13 @@ void MallocChecker::checkDeadSymbols(SymbolReaper &SymReaper,
   RegionStateTy::Factory &F = state->get_context<RegionState>();
 
   bool generateReport = false;
-  
+  llvm::SmallVector<SymbolRef, 2> Errors;
   for (RegionStateTy::iterator I = RS.begin(), E = RS.end(); I != E; ++I) {
     if (SymReaper.isDead(I->first)) {
-      if (I->second.isAllocated())
+      if (I->second.isAllocated()) {
         generateReport = true;
-
+        Errors.push_back(I->first);
+      }
       // Remove the dead symbol from the map.
       RS = F.remove(RS, I->first);
 
@@ -665,17 +666,16 @@ void MallocChecker::checkDeadSymbols(SymbolReaper &SymReaper,
   
   ExplodedNode *N = C.addTransition(state->set<RegionState>(RS));
 
-  // FIXME: This does not handle when we have multiple leaks at a single
-  // place.
-  // TODO: We don't have symbol info in the diagnostics here!
   if (N && generateReport) {
     if (!BT_Leak)
       BT_Leak.reset(new BuiltinBug("Memory leak",
-              "Allocated memory never released. Potential memory leak."));
-    // FIXME: where it is allocated.
-    BugReport *R = new BugReport(*BT_Leak, BT_Leak->getDescription(), N);
-    //Report->addVisitor(new MallocBugVisitor(Sym));
-    C.EmitReport(R);
+          "Allocated memory never released. Potential memory leak."));
+    for (llvm::SmallVector<SymbolRef, 2>::iterator
+          I = Errors.begin(), E = Errors.end(); I != E; ++I) {
+      BugReport *R = new BugReport(*BT_Leak, BT_Leak->getDescription(), N);
+      R->addVisitor(new MallocBugVisitor(*I));
+      C.EmitReport(R);
+    }
   }
 }