]> granicus.if.org Git - clang/commitdiff
Implement MallocChecker::EvalDeadSymbols() with the new API. This time we
authorZhongxing Xu <xuzhongxing@gmail.com>
Sun, 15 Aug 2010 08:19:57 +0000 (08:19 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Sun, 15 Aug 2010 08:19:57 +0000 (08:19 +0000)
iterate over symbols being tracked, instead of symbols being dead.

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

lib/Checker/MallocChecker.cpp

index 8765465d9c517b2622cc7e12acb5fd58735c84e6..ba904bc6b743722c83600bb335ff061423220031 100644 (file)
@@ -562,22 +562,23 @@ void MallocChecker::CallocMem(CheckerContext &C, const CallExpr *CE) {
 }
 
 void MallocChecker::EvalDeadSymbols(CheckerContext &C,SymbolReaper &SymReaper) {
-  for (SymbolReaper::dead_iterator I = SymReaper.dead_begin(),
-         E = SymReaper.dead_end(); I != E; ++I) {
-    SymbolRef Sym = *I;
-    const GRState *state = C.getState();
-    const RefState *RS = state->get<RegionState>(Sym);
-    if (!RS)
-      return;
-
-    if (RS->isAllocated()) {
-      if (ExplodedNode *N = C.GenerateSink()) {
-        if (!BT_Leak)
-          BT_Leak = new BuiltinBug("Memory leak",
+  if (!SymReaper.hasDeadSymbols())
+    return;
+
+  const GRState *state = C.getState();
+  RegionStateTy RS = state->get<RegionState>();
+
+  for (RegionStateTy::iterator I = RS.begin(), E = RS.end(); I != E; ++I) {
+    if (SymReaper.isDead(I->first)) {
+      if (I->second.isAllocated()) {
+        if (ExplodedNode *N = C.GenerateSink()) {
+          if (!BT_Leak)
+            BT_Leak = 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);
-        C.EmitReport(R);
+          // FIXME: where it is allocated.
+          BugReport *R = new BugReport(*BT_Leak, BT_Leak->getDescription(), N);
+          C.EmitReport(R);
+        }
       }
     }
   }