From: Zhongxing Xu Date: Sun, 15 Aug 2010 08:19:57 +0000 (+0000) Subject: Implement MallocChecker::EvalDeadSymbols() with the new API. This time we X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=173ff5669699bd69eaa63421d764d3f0fd74b4e7;p=clang Implement MallocChecker::EvalDeadSymbols() with the new API. This time we 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 --- diff --git a/lib/Checker/MallocChecker.cpp b/lib/Checker/MallocChecker.cpp index 8765465d9c..ba904bc6b7 100644 --- a/lib/Checker/MallocChecker.cpp +++ b/lib/Checker/MallocChecker.cpp @@ -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(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(); + + 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); + } } } }