forked from OSchip/llvm-project
Fix a memory leak in the analyzer - BugReports didn't get freed. Plus, remove invalid assert from the destructor which wasn't called previously due to the leak.
llvm-svn: 138027
This commit is contained in:
parent
da616d06e9
commit
be28d6c66d
|
@ -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<BugReportEquivClass> EQClasses;
|
||||
/// A vector of BugReports for tracking the allocated pointers and cleanup.
|
||||
std::vector<BugReportEquivClass *> EQClassesVector;
|
||||
|
||||
protected:
|
||||
BugReporter(BugReporterData& d, Kind k) : BugTypes(F.getEmptySet()), kind(k),
|
||||
|
|
|
@ -1224,10 +1224,10 @@ 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());
|
||||
if ((*I)->isOwnedByReporterContext()) {
|
||||
delete *I;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BugReport::Profile(llvm::FoldingSetNodeID& hash) const {
|
||||
|
@ -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<BugReportEquivClass *> 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);
|
||||
|
|
Loading…
Reference in New Issue