diff --git a/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h b/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h index 2b9d1a89f51c..421e305508a7 100644 --- a/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h +++ b/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h @@ -128,7 +128,7 @@ public: virtual ~BugReport(); - bool isOwnedByReporterContext() { return false; } + virtual bool isOwnedByReporterContext() { return false; } const BugType& getBugType() const { return BT; } BugType& getBugType() { return BT; } @@ -275,6 +275,8 @@ private: /// The set of bug reports tracked by the BugReporter. llvm::FoldingSet EQClasses; + /// A vector of BugReports for tracking the allocated pointers and cleanup. + std::vector EQClassesVector; protected: BugReporter(BugReporterData& d, Kind k) : BugTypes(F.getEmptySet()), kind(k), diff --git a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp index 6624b93d2bf3..6821806c8467 100644 --- a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -1224,9 +1224,9 @@ void BugReport::addVisitor(BugReporterVisitor* visitor) { BugReport::~BugReport() { for (visitor_iterator I = visitor_begin(), E = visitor_end(); I != E; ++I) { - // TODO: Remove the isOwned method; use reference counting to track visitors?. - assert((*I)->isOwnedByReporterContext()); - delete *I; + if ((*I)->isOwnedByReporterContext()) { + delete *I; + } } } @@ -1363,7 +1363,16 @@ ExplodedGraph &GRBugReporter::getGraph() { return Eng.getGraph(); } ProgramStateManager& GRBugReporter::getStateManager() { return Eng.getStateManager(); } -BugReporter::~BugReporter() { FlushReports(); } +BugReporter::~BugReporter() { + FlushReports(); + + // Free the bug reports we are tracking. + typedef std::vector ContTy; + for (ContTy::iterator I = EQClassesVector.begin(), E = EQClassesVector.end(); + I != E; ++I) { + delete *I; + } +} void BugReporter::FlushReports() { if (BugTypes.isEmpty()) @@ -1694,6 +1703,7 @@ void BugReporter::EmitReport(BugReport* R) { if (!EQ) { EQ = new BugReportEquivClass(R); EQClasses.InsertNode(EQ, InsertPos); + EQClassesVector.push_back(EQ); } else EQ->AddReport(R);