diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-04-17 23:43:50 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-04-17 23:43:50 +0000 |
commit | 989d519636f7133ff48e7caf640344f0da8b65df (patch) | |
tree | 4d81535087b71ca1932b8d1667efa69864c82cda /lib/Analysis/CFRefCount.cpp | |
parent | 9227c6953497be34281354f949d6f4cd34a696cc (diff) |
Hook up reporting reference count memory leaks to the BugReporter mechanism.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49879 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/CFRefCount.cpp')
-rw-r--r-- | lib/Analysis/CFRefCount.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index 4fcef670d3..0cfd5771fa 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -461,6 +461,22 @@ namespace { virtual void EmitWarnings(BugReporter& BR); }; + class VISIBILITY_HIDDEN Leak : public CFRefBug { + public: + Leak(CFRefCount& tf) : CFRefBug(tf) {} + + virtual const char* getName() const { + return "(CoreFoundation) Memory Leak"; + } + + virtual const char* getDescription() const { + return "The CoreFoundation object has an excessive reference count and" + "\nis leaked after this statement."; + } + + virtual void EmitWarnings(BugReporter& BR); + }; + } // end anonymous namespace //===----------------------------------------------------------------------===// @@ -740,12 +756,16 @@ public: typedef UseAfterReleasesTy::iterator use_after_iterator; typedef ReleasesNotOwnedTy::iterator bad_release_iterator; + typedef LeaksTy::iterator leaks_iterator; use_after_iterator use_after_begin() { return UseAfterReleases.begin(); } use_after_iterator use_after_end() { return UseAfterReleases.end(); } bad_release_iterator bad_release_begin() { return ReleasesNotOwned.begin(); } bad_release_iterator bad_release_end() { return ReleasesNotOwned.end(); } + + leaks_iterator leaks_begin() { return Leaks.begin(); } + leaks_iterator leaks_end() { return Leaks.end(); } }; } // end anonymous namespace @@ -754,6 +774,7 @@ void CFRefCount::RegisterChecks(GRExprEngine& Eng) { GRSimpleVals::RegisterChecks(Eng); Eng.Register(new UseAfterRelease(*this)); Eng.Register(new BadRelease(*this)); + Eng.Register(new Leak(*this)); } @@ -1276,6 +1297,16 @@ void BadRelease::EmitWarnings(BugReporter& BR) { } } +void Leak::EmitWarnings(BugReporter& BR) { + + for (CFRefCount::leaks_iterator I = TF.leaks_begin(), + E = TF.leaks_end(); I != E; ++I) { + + BugReport report(*this, I->second); + BR.EmitPathWarning(report); + } +} + //===----------------------------------------------------------------------===// // Transfer function creation for external clients. //===----------------------------------------------------------------------===// |