diff options
author | Jordan Rose <jordan_rose@apple.com> | 2012-11-15 19:11:33 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2012-11-15 19:11:33 +0000 |
commit | f1f2614017aca25ed471371fd987e967258a0ba5 (patch) | |
tree | deb35792dcad125893aa240e8b279ed5ac27683a /clang/lib/StaticAnalyzer | |
parent | b5b0fc196e8768076c3c9155cd79b248623861de (diff) | |
download | bcm5719-llvm-f1f2614017aca25ed471371fd987e967258a0ba5.tar.gz bcm5719-llvm-f1f2614017aca25ed471371fd987e967258a0ba5.zip |
[analyzer] MallocChecker: Remove now-unnecessary check::EndPath callback.
Also, don't bother to stop tracking symbols in the return value, either.
They are now properly considered live during checkDeadSymbols.
llvm-svn: 168067
Diffstat (limited to 'clang/lib/StaticAnalyzer')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp | 30 |
1 files changed, 1 insertions, 29 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index caf70ca3706..aadf2ddfc9c 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -102,7 +102,6 @@ struct ReallocPair { typedef std::pair<const Stmt*, const MemRegion*> LeakInfo; class MallocChecker : public Checker<check::DeadSymbols, - check::EndPath, check::PreStmt<ReturnStmt>, check::PreStmt<CallExpr>, check::PostStmt<CallExpr>, @@ -138,7 +137,6 @@ public: void checkPostObjCMessage(const ObjCMethodCall &Call, CheckerContext &C) const; void checkPostStmt(const BlockExpr *BE, CheckerContext &C) const; void checkDeadSymbols(SymbolReaper &SymReaper, CheckerContext &C) const; - void checkEndPath(CheckerContext &C) const; void checkPreStmt(const ReturnStmt *S, CheckerContext &C) const; ProgramStateRef evalAssume(ProgramStateRef state, SVal Cond, bool Assumption) const; @@ -1134,24 +1132,6 @@ void MallocChecker::checkDeadSymbols(SymbolReaper &SymReaper, C.addTransition(state->set<RegionState>(RS), N); } -void MallocChecker::checkEndPath(CheckerContext &C) const { - ProgramStateRef state = C.getState(); - RegionStateTy M = state->get<RegionState>(); - - // If inside inlined call, skip it. - if (C.getLocationContext()->getParent() != 0) - return; - - for (RegionStateTy::iterator I = M.begin(), E = M.end(); I != E; ++I) { - RefState RS = I->second; - if (RS.isAllocated()) { - ExplodedNode *N = C.addTransition(state); - if (N) - reportLeak(I->first, N, C); - } - } -} - void MallocChecker::checkPreStmt(const CallExpr *CE, CheckerContext &C) const { // We will check for double free in the post visit. if (isFreeFunction(C.getCalleeDecl(CE), C.getASTContext())) @@ -1193,15 +1173,7 @@ void MallocChecker::checkPreStmt(const ReturnStmt *S, CheckerContext &C) const { // Check if we are returning freed memory. if (Sym) - if (checkUseAfterFree(Sym, C, E)) - return; - - // If this function body is not inlined, stop tracking any returned symbols. - if (C.getLocationContext()->getParent() == 0) { - State = - State->scanReachableSymbols<StopTrackingCallback>(RetVal).getState(); - C.addTransition(State); - } + checkUseAfterFree(Sym, C, E); } // TODO: Blocks should be either inlined or should call invalidate regions |