diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-07-02 21:24:01 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-07-02 21:24:01 +0000 |
commit | c095997b853270d8adb6fe55209a4dbc42803d16 (patch) | |
tree | 998b434ab07cafbb018bf3c248bcf2476e5738a8 /lib/Analysis/BugReporter.cpp | |
parent | 8b23361a6a50be6dbd1056add570eb90598474b0 (diff) |
Refactored some of the BugReporter interface so that data such as the ASTContext&, PathDiagnosticClient*, can be provided by an external source.
Split BugReporter into BugReporter and GRBugReporter so checkers not based on GRExprEngine can still use the BugReporter mechanism.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53048 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BugReporter.cpp')
-rw-r--r-- | lib/Analysis/BugReporter.cpp | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/lib/Analysis/BugReporter.cpp b/lib/Analysis/BugReporter.cpp index 26dba4e7e8..1741e7dc9b 100644 --- a/lib/Analysis/BugReporter.cpp +++ b/lib/Analysis/BugReporter.cpp @@ -27,22 +27,20 @@ using namespace clang; BugReporter::~BugReporter() {} +GRBugReporter::~GRBugReporter() {} +BugReporterData::~BugReporterData() {} BugType::~BugType() {} BugReport::~BugReport() {} RangedBugReport::~RangedBugReport() {} -ExplodedGraph<ValueState>& BugReporter::getGraph() { +ExplodedGraph<ValueState>& GRBugReporter::getGraph() { return Eng.getGraph(); } -ValueStateManager& BugReporter::getStateManager() { +ValueStateManager& GRBugReporter::getStateManager() { return Eng.getStateManager(); } -ParentMap& BugReporter::getParentMap() { - return Eng.getParentMap(); -} - static inline Stmt* GetStmt(const ProgramPoint& P) { if (const PostStmt* PS = dyn_cast<PostStmt>(&P)) { return PS->getStmt(); @@ -338,7 +336,7 @@ static void HandleNotableSymbol(ExplodedNode<ValueState>* N, Stmt* S, // specified symbol. Are any of them not in the previous state. ValueState* St = N->getState(); - ValueStateManager& VMgr = BR.getStateManager(); + ValueStateManager& VMgr = cast<GRBugReporter>(BR).getStateManager(); // FIXME: Later generalize for a broader memory model. @@ -411,8 +409,8 @@ static void HandleNotableSymbol(ExplodedNode<ValueState>* N, Stmt* S, } } -void BugReporter::GeneratePathDiagnostic(PathDiagnostic& PD, - BugReport& R) { +void GRBugReporter::GeneratePathDiagnostic(PathDiagnostic& PD, + BugReport& R) { ExplodedNode<ValueState>* N = R.getEndNode(); @@ -438,6 +436,7 @@ void BugReporter::GeneratePathDiagnostic(PathDiagnostic& PD, ExplodedNode<ValueState>* NextNode = N->pred_empty() ? NULL : *(N->pred_begin()); + ASTContext& Ctx = getContext(); SourceManager& SMgr = Ctx.getSourceManager(); while (NextNode) { @@ -715,6 +714,8 @@ void BugReporter::EmitWarning(BugReport& R) { // Emit a full diagnostic for the path if we have a PathDiagnosticClient. + PathDiagnosticClient* PD = getPathDiagnosticClient(); + if (PD && !D->empty()) { PD->HandlePathDiagnostic(D.take()); return; @@ -723,7 +724,7 @@ void BugReporter::EmitWarning(BugReport& R) { // We don't have a PathDiagnosticClient, but we can still emit a single // line diagnostic. Determine the location. - FullSourceLoc L = D->empty() ? R.getLocation(Ctx.getSourceManager()) + FullSourceLoc L = D->empty() ? R.getLocation(getSourceManager()) : D->back()->getLocation(); @@ -749,7 +750,6 @@ void BugReporter::EmitWarning(BugReport& R) { } else { std::ostringstream os; - os << "[CHECKER] "; if (D->empty()) os << R.getDescription(); @@ -757,6 +757,7 @@ void BugReporter::EmitWarning(BugReport& R) { os << D->back()->getString(); + Diagnostic& Diag = getDiagnostic(); unsigned ErrorDiag = Diag.getCustomDiagID(Diagnostic::Warning, os.str().c_str()); |