diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-04-18 01:56:37 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-04-18 01:56:37 +0000 |
commit | 75840e1501563fe7c3dcb5600b75965ba1fe1bc4 (patch) | |
tree | 3cd0ad5ad1d8aaa8e46237f0886d9328c2891862 /lib/Analysis/BugReporter.cpp | |
parent | 5833b901d02e628c9bcdb1c59efcc100a1faecad (diff) |
Simplified internal logic of BugReporter, consolidating EmitWarning and
EmitPathWarning into one method. We now properly handle emitting warnings
without a PathDiagnosticClient when the warning does not involve a particular
statement.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49884 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BugReporter.cpp')
-rw-r--r-- | lib/Analysis/BugReporter.cpp | 82 |
1 files changed, 40 insertions, 42 deletions
diff --git a/lib/Analysis/BugReporter.cpp b/lib/Analysis/BugReporter.cpp index d1689e2e51..294eb5faac 100644 --- a/lib/Analysis/BugReporter.cpp +++ b/lib/Analysis/BugReporter.cpp @@ -142,8 +142,10 @@ PathDiagnosticPiece* BugReport::VisitNode(ExplodedNode<ValueState>* N, void BugReporter::GeneratePathDiagnostic(PathDiagnostic& PD, BugReport& R) { - ExplodedNode<ValueState>* N = R.getEndNode(); - assert (N && "Path diagnostic requires a ExplodedNode."); + ExplodedNode<ValueState>* N = R.getEndNode(); + + if (!N) + return; llvm::OwningPtr<ExplodedGraph<ValueState> > GTrim(getGraph().Trim(&N, &N+1)); @@ -371,55 +373,51 @@ bool BugReporter::IsCached(ExplodedNode<ValueState>* N) { return false; } -void BugReporter::EmitPathWarning(BugReport& R) { - - ExplodedNode<ValueState>* N = R.getEndNode(); - - if (!PD || !N) { - EmitWarning(R); - return; - } - - if (IsCached(N)) +void BugReporter::EmitWarning(BugReport& R) { + + if (IsCached(R.getEndNode())) return; - + PathDiagnostic D(R.getName()); GeneratePathDiagnostic(D, R); + + // Emit a full diagnostic for the path if we have a PathDiagnosticClient. - if (!D.empty()) + if (PD && !D.empty()) { PD->HandlePathDiagnostic(D); -} - -void BugReporter::EmitWarning(BugReport& R) { - - ExplodedNode<ValueState>* N = R.getEndNode(); + return; + } - if (N && IsCached(N)) - return; + // We don't have a PathDiagnosticClient, but we can still emit a single + // line diagnostic. Determine the location. - FullSourceLoc L = R.getLocation(Ctx.getSourceManager()); + FullSourceLoc L = D.empty() ? R.getLocation(Ctx.getSourceManager()) + : D.back()->getLocation(); - const SourceRange *Beg, *End; - R.getRanges(Beg, End); - if (!PD) { + // Determine the range. - std::ostringstream os; - os << "[CHECKER] " << R.getDescription(); - - unsigned ErrorDiag = Diag.getCustomDiagID(Diagnostic::Warning, - os.str().c_str()); - - Diag.Report(L, ErrorDiag, NULL, 0, Beg, End - Beg); - } - else { - PathDiagnostic D(R.getName()); - PathDiagnosticPiece* piece = new PathDiagnosticPiece(L, R.getDescription()); - - for ( ; Beg != End; ++Beg) - piece->addRange(*Beg); - - D.push_back(piece); - PD->HandlePathDiagnostic(D); + const SourceRange *Beg, *End; + + if (!D.empty()) { + Beg = D.back()->ranges_begin(); + End = D.back()->ranges_end(); } + else + R.getRanges(Beg, End); + + // Compute the message. + + std::ostringstream os; + os << "[CHECKER] "; + + if (D.empty()) + os << R.getDescription(); + else + os << D.back()->getString(); + + unsigned ErrorDiag = Diag.getCustomDiagID(Diagnostic::Warning, + os.str().c_str()); + + Diag.Report(L, ErrorDiag, NULL, 0, Beg, End - Beg); } |