summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/CFRefCount.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-04-17 23:43:50 +0000
committerTed Kremenek <kremenek@apple.com>2008-04-17 23:43:50 +0000
commitcc0951bde1b2c134d66c6c7927b4b1e8d30ac53e (patch)
tree3d3ef50a1f7bc115a1bce3539cf74c4b10c3e308 /clang/lib/Analysis/CFRefCount.cpp
parent5879213597044ad8db2e9ca2c49fcac60bd18807 (diff)
downloadbcm5719-llvm-cc0951bde1b2c134d66c6c7927b4b1e8d30ac53e.tar.gz
bcm5719-llvm-cc0951bde1b2c134d66c6c7927b4b1e8d30ac53e.zip
Hook up reporting reference count memory leaks to the BugReporter mechanism.
llvm-svn: 49879
Diffstat (limited to 'clang/lib/Analysis/CFRefCount.cpp')
-rw-r--r--clang/lib/Analysis/CFRefCount.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/clang/lib/Analysis/CFRefCount.cpp b/clang/lib/Analysis/CFRefCount.cpp
index 4fcef670d32..0cfd5771fa0 100644
--- a/clang/lib/Analysis/CFRefCount.cpp
+++ b/clang/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.
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud