diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-05-06 18:11:09 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-05-06 18:11:09 +0000 |
commit | 8bcc1bd3d51cd3df2e75a06eb9851ef3b31b844a (patch) | |
tree | 352de0694d4886e52efc46f882f9c2ad2b01035d /clang/lib/Analysis/BugReporter.cpp | |
parent | fc905c64ab242f84be42c7c0dcfce862e917bf72 (diff) | |
download | bcm5719-llvm-8bcc1bd3d51cd3df2e75a06eb9851ef3b31b844a.tar.gz bcm5719-llvm-8bcc1bd3d51cd3df2e75a06eb9851ef3b31b844a.zip |
More refactorings in GeneratePathDiagnostic: use ExecutionContinues to display
"Execution continues..." message, which does a better job at handling corner cases.
llvm-svn: 50751
Diffstat (limited to 'clang/lib/Analysis/BugReporter.cpp')
-rw-r--r-- | clang/lib/Analysis/BugReporter.cpp | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/clang/lib/Analysis/BugReporter.cpp b/clang/lib/Analysis/BugReporter.cpp index c907c248c04..e2d98b0cf60 100644 --- a/clang/lib/Analysis/BugReporter.cpp +++ b/clang/lib/Analysis/BugReporter.cpp @@ -48,10 +48,8 @@ static inline Stmt* GetStmt(const ProgramPoint& P) { } static inline Stmt* GetStmt(const CFGBlock* B) { - if (B->empty()) { - assert (B->getTerminator() && "Empty block should have a terminator."); + if (B->empty()) return const_cast<Stmt*>(B->getTerminator()); - } else return (*B)[0]; } @@ -75,19 +73,35 @@ static Stmt* GetLastStmt(ExplodedNode<ValueState>* N) { return NULL; } - -static void ExecutionContinues(std::ostream& os, SourceManager& SMgr, - ExplodedNode<ValueState>* N) { - - Stmt* S = GetStmt(N->getLocation()); +static void ExecutionContinues(std::ostringstream& os, SourceManager& SMgr, + Stmt* S) { if (!S) return; - - os << "Execution continue on line " + + // Slow, but probably doesn't matter. + if (os.str().empty()) + os << ' '; + + os << "Execution continues on line " << SMgr.getLogicalLineNumber(S->getLocStart()) << '.'; } + + +static inline void ExecutionContinues(std::ostringstream& os, + SourceManager& SMgr, + ExplodedNode<ValueState>* N) { + + ExecutionContinues(os, SMgr, GetStmt(N->getLocation())); +} + +static inline void ExecutionContinues(std::ostringstream& os, + SourceManager& SMgr, + const CFGBlock* B) { + ExecutionContinues(os, SMgr, GetStmt(B)); +} + Stmt* BugReport::getStmt(BugReporter& BR) const { @@ -375,8 +389,8 @@ void BugReporter::GeneratePathDiagnostic(PathDiagnostic& PD, std::ostringstream os; - os << "Loop condition is true. Execution continues on line " - << SMgr.getLogicalLineNumber(GetStmt(Dst)->getLocStart()) << '.'; + os << "Loop condition is true."; + ExecutionContinues(os, SMgr, Dst); PD.push_front(new PathDiagnosticPiece(L, os.str())); } @@ -394,8 +408,8 @@ void BugReporter::GeneratePathDiagnostic(PathDiagnostic& PD, std::ostringstream os; - os << "Loop condition is false. Execution continues on line " - << SMgr.getLogicalLineNumber(GetStmt(Dst)->getLocStart()) << '.'; + os << "Loop condition is false."; + ExecutionContinues(os, SMgr, Dst); PD.push_front(new PathDiagnosticPiece(L, os.str())); } |