Hook up reporting reference count memory leaks to the BugReporter mechanism.
llvm-svn: 49879
This commit is contained in:
parent
5879213597
commit
cc0951bde1
|
|
@ -461,6 +461,22 @@ namespace {
|
||||||
virtual void EmitWarnings(BugReporter& BR);
|
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
|
} // end anonymous namespace
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
@ -740,12 +756,16 @@ public:
|
||||||
|
|
||||||
typedef UseAfterReleasesTy::iterator use_after_iterator;
|
typedef UseAfterReleasesTy::iterator use_after_iterator;
|
||||||
typedef ReleasesNotOwnedTy::iterator bad_release_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_begin() { return UseAfterReleases.begin(); }
|
||||||
use_after_iterator use_after_end() { return UseAfterReleases.end(); }
|
use_after_iterator use_after_end() { return UseAfterReleases.end(); }
|
||||||
|
|
||||||
bad_release_iterator bad_release_begin() { return ReleasesNotOwned.begin(); }
|
bad_release_iterator bad_release_begin() { return ReleasesNotOwned.begin(); }
|
||||||
bad_release_iterator bad_release_end() { return ReleasesNotOwned.end(); }
|
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
|
} // end anonymous namespace
|
||||||
|
|
@ -754,6 +774,7 @@ void CFRefCount::RegisterChecks(GRExprEngine& Eng) {
|
||||||
GRSimpleVals::RegisterChecks(Eng);
|
GRSimpleVals::RegisterChecks(Eng);
|
||||||
Eng.Register(new UseAfterRelease(*this));
|
Eng.Register(new UseAfterRelease(*this));
|
||||||
Eng.Register(new BadRelease(*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.
|
// Transfer function creation for external clients.
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue