[cfe-commits] r49879 - /cfe/trunk/lib/Analysis/CFRefCount.cpp

Ted Kremenek kremenek at apple.com
Thu Apr 17 16:43:50 PDT 2008


Author: kremenek
Date: Thu Apr 17 18:43:50 2008
New Revision: 49879

URL: http://llvm.org/viewvc/llvm-project?rev=49879&view=rev
Log:
Hook up reporting reference count memory leaks to the BugReporter mechanism.

Modified:
    cfe/trunk/lib/Analysis/CFRefCount.cpp

Modified: cfe/trunk/lib/Analysis/CFRefCount.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFRefCount.cpp?rev=49879&r1=49878&r2=49879&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/CFRefCount.cpp (original)
+++ cfe/trunk/lib/Analysis/CFRefCount.cpp Thu Apr 17 18:43:50 2008
@@ -461,6 +461,22 @@
     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 @@
 
   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 @@
   GRSimpleVals::RegisterChecks(Eng);
   Eng.Register(new UseAfterRelease(*this));
   Eng.Register(new BadRelease(*this));
+  Eng.Register(new Leak(*this));
 }
 
 
@@ -1276,6 +1297,16 @@
   }  
 }
 
+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.
 //===----------------------------------------------------------------------===//





More information about the cfe-commits mailing list