[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:
Artem Dergachev 2019-08-20 21:41:20 +00:00
parent 8eb7a74b78
commit 3fdc427f0b
3 changed files with 9 additions and 30 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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)