[analyzer] NFC: Remove the BugTypes set from BugReporter.
Its only purpose was to avoid a bug that's caused by making a virtual call in BugReporter's destructor. llvm-svn: 369451
This commit is contained in:
parent
8eb7a74b78
commit
3fdc427f0b
|
@ -408,11 +408,6 @@ public:
|
||||||
enum Kind { BasicBRKind, PathSensitiveBRKind };
|
enum Kind { BasicBRKind, PathSensitiveBRKind };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
using BugTypesTy = llvm::ImmutableSet<BugType *>;
|
|
||||||
|
|
||||||
BugTypesTy::Factory F;
|
|
||||||
BugTypesTy BugTypes;
|
|
||||||
|
|
||||||
const Kind kind;
|
const Kind kind;
|
||||||
BugReporterData& D;
|
BugReporterData& D;
|
||||||
|
|
||||||
|
@ -433,11 +428,10 @@ private:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
BugReporter(BugReporterData& d, Kind k)
|
BugReporter(BugReporterData& d, Kind k)
|
||||||
: BugTypes(F.getEmptySet()), kind(k), D(d) {}
|
: kind(k), D(d) {}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BugReporter(BugReporterData& d)
|
BugReporter(BugReporterData &d) : kind(BasicBRKind), D(d) {}
|
||||||
: BugTypes(F.getEmptySet()), kind(BasicBRKind), D(d) {}
|
|
||||||
virtual ~BugReporter();
|
virtual ~BugReporter();
|
||||||
|
|
||||||
/// Generate and flush diagnostics for all bug reports.
|
/// Generate and flush diagnostics for all bug reports.
|
||||||
|
@ -453,11 +447,6 @@ public:
|
||||||
return D.getPathDiagnosticConsumers();
|
return D.getPathDiagnosticConsumers();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Iterator over the set of BugTypes tracked by the BugReporter.
|
|
||||||
using iterator = BugTypesTy::iterator;
|
|
||||||
iterator begin() { return BugTypes.begin(); }
|
|
||||||
iterator end() { return BugTypes.end(); }
|
|
||||||
|
|
||||||
/// Iterator over the set of BugReports tracked by the BugReporter.
|
/// Iterator over the set of BugReports tracked by the BugReporter.
|
||||||
using EQClasses_iterator = llvm::FoldingSet<BugReportEquivClass>::iterator;
|
using EQClasses_iterator = llvm::FoldingSet<BugReportEquivClass>::iterator;
|
||||||
EQClasses_iterator EQClasses_begin() { return EQClasses.begin(); }
|
EQClasses_iterator EQClasses_begin() { return EQClasses.begin(); }
|
||||||
|
@ -475,8 +464,6 @@ public:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void Register(const BugType *BT);
|
|
||||||
|
|
||||||
/// Add the given report to the set of reports tracked by BugReporter.
|
/// Add the given report to the set of reports tracked by BugReporter.
|
||||||
///
|
///
|
||||||
/// The reports are usually generated by the checkers. Further, they are
|
/// The reports are usually generated by the checkers. Further, they are
|
||||||
|
@ -511,8 +498,6 @@ public:
|
||||||
PathSensitiveBugReporter(BugReporterData& d, ExprEngine& eng)
|
PathSensitiveBugReporter(BugReporterData& d, ExprEngine& eng)
|
||||||
: BugReporter(d, PathSensitiveBRKind), Eng(eng) {}
|
: BugReporter(d, PathSensitiveBRKind), Eng(eng) {}
|
||||||
|
|
||||||
~PathSensitiveBugReporter() override = default;
|
|
||||||
|
|
||||||
/// getGraph - Get the exploded graph created by the analysis engine
|
/// getGraph - Get the exploded graph created by the analysis engine
|
||||||
/// for the analyzed method or function.
|
/// for the analyzed method or function.
|
||||||
const ExplodedGraph &getGraph() const;
|
const ExplodedGraph &getGraph() const;
|
||||||
|
|
|
@ -2227,7 +2227,9 @@ ProgramStateManager &PathSensitiveBugReporter::getStateManager() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
BugReporter::~BugReporter() {
|
BugReporter::~BugReporter() {
|
||||||
FlushReports();
|
// Make sure reports are flushed.
|
||||||
|
assert(StrBugTypes.empty() &&
|
||||||
|
"Destroying BugReporter before diagnostics are emitted!");
|
||||||
|
|
||||||
// Free the bug reports we are tracking.
|
// Free the bug reports we are tracking.
|
||||||
for (const auto I : EQClassesVector)
|
for (const auto I : EQClassesVector)
|
||||||
|
@ -2235,9 +2237,6 @@ BugReporter::~BugReporter() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void BugReporter::FlushReports() {
|
void BugReporter::FlushReports() {
|
||||||
if (BugTypes.isEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// We need to flush reports in deterministic order to ensure the order
|
// We need to flush reports in deterministic order to ensure the order
|
||||||
// of the reports is consistent between runs.
|
// of the reports is consistent between runs.
|
||||||
for (const auto EQ : EQClassesVector)
|
for (const auto EQ : EQClassesVector)
|
||||||
|
@ -2248,9 +2247,6 @@ void BugReporter::FlushReports() {
|
||||||
// FIXME: There are leaks from checkers that assume that the BugTypes they
|
// FIXME: There are leaks from checkers that assume that the BugTypes they
|
||||||
// create will be destroyed by the BugReporter.
|
// create will be destroyed by the BugReporter.
|
||||||
llvm::DeleteContainerSeconds(StrBugTypes);
|
llvm::DeleteContainerSeconds(StrBugTypes);
|
||||||
|
|
||||||
// Remove all references to the BugType objects.
|
|
||||||
BugTypes = F.getEmptySet();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
@ -2668,10 +2664,6 @@ PathSensitiveBugReporter::generatePathDiagnostics(
|
||||||
return Out;
|
return Out;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BugReporter::Register(const BugType *BT) {
|
|
||||||
BugTypes = F.add(BugTypes, BT);
|
|
||||||
}
|
|
||||||
|
|
||||||
void BugReporter::emitReport(std::unique_ptr<BugReport> R) {
|
void BugReporter::emitReport(std::unique_ptr<BugReport> R) {
|
||||||
if (const ExplodedNode *E = R->getErrorNode()) {
|
if (const ExplodedNode *E = R->getErrorNode()) {
|
||||||
// An error node must either be a sink or have a tag, otherwise
|
// An error node must either be a sink or have a tag, otherwise
|
||||||
|
@ -2702,8 +2694,6 @@ void BugReporter::emitReport(std::unique_ptr<BugReport> R) {
|
||||||
R->Profile(ID);
|
R->Profile(ID);
|
||||||
|
|
||||||
// Lookup the equivance class. If there isn't one, create it.
|
// Lookup the equivance class. If there isn't one, create it.
|
||||||
const BugType& BT = R->getBugType();
|
|
||||||
Register(&BT);
|
|
||||||
void *InsertPos;
|
void *InsertPos;
|
||||||
BugReportEquivClass* EQ = EQClasses.FindNodeOrInsertPos(ID, InsertPos);
|
BugReportEquivClass* EQ = EQClasses.FindNodeOrInsertPos(ID, InsertPos);
|
||||||
|
|
||||||
|
|
|
@ -609,6 +609,7 @@ void AnalysisConsumer::runAnalysisOnTranslationUnit(ASTContext &C) {
|
||||||
// After all decls handled, run checkers on the entire TranslationUnit.
|
// After all decls handled, run checkers on the entire TranslationUnit.
|
||||||
checkerMgr->runCheckersOnEndOfTranslationUnit(TU, *Mgr, BR);
|
checkerMgr->runCheckersOnEndOfTranslationUnit(TU, *Mgr, BR);
|
||||||
|
|
||||||
|
BR.FlushReports();
|
||||||
RecVisitorBR = nullptr;
|
RecVisitorBR = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -766,6 +767,9 @@ void AnalysisConsumer::HandleCode(Decl *D, AnalysisMode Mode,
|
||||||
if (SyntaxCheckTimer)
|
if (SyntaxCheckTimer)
|
||||||
SyntaxCheckTimer->stopTimer();
|
SyntaxCheckTimer->stopTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BR.FlushReports();
|
||||||
|
|
||||||
if ((Mode & AM_Path) && checkerMgr->hasPathSensitiveCheckers()) {
|
if ((Mode & AM_Path) && checkerMgr->hasPathSensitiveCheckers()) {
|
||||||
RunPathSensitiveChecks(D, IMode, VisitedCallees);
|
RunPathSensitiveChecks(D, IMode, VisitedCallees);
|
||||||
if (IMode != ExprEngine::Inline_Minimal)
|
if (IMode != ExprEngine::Inline_Minimal)
|
||||||
|
|
Loading…
Reference in New Issue