зеркало из https://github.com/microsoft/clang-1.git
Fix bug in BugReporter where we didn't handle emitting diagnostics for
empty CFGBlocks that only contained a terminator. Added improved diagnostics for break and continue statements and default branches in switch statements. This fixes <rdar://problem/5889244>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50286 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
ce2e33258a
Коммит
2673c9ff76
|
@ -48,7 +48,11 @@ static inline Stmt* GetStmt(const ProgramPoint& P) {
|
|||
}
|
||||
|
||||
static inline Stmt* GetStmt(const CFGBlock* B) {
|
||||
assert (!B->empty());
|
||||
if (B->empty()) {
|
||||
assert (B->getTerminator() && "Empty block should have a terminator.");
|
||||
return const_cast<Stmt*>(B->getTerminator());
|
||||
}
|
||||
else
|
||||
return (*B)[0];
|
||||
}
|
||||
|
||||
|
@ -61,6 +65,17 @@ GetNextNode(ExplodedNode<ValueState>* N) {
|
|||
return N->pred_empty() ? NULL : *(N->pred_begin());
|
||||
}
|
||||
|
||||
static void ExecutionContinues(std::ostream& os, SourceManager& SMgr,
|
||||
ExplodedNode<ValueState>* N) {
|
||||
|
||||
Stmt* S = GetStmt(N->getLocation());
|
||||
|
||||
if (!S)
|
||||
return;
|
||||
|
||||
os << "Execution continue on line "
|
||||
<< SMgr.getLogicalLineNumber(S->getLocStart()) << '.';
|
||||
}
|
||||
|
||||
static Stmt* GetLastStmt(ExplodedNode<ValueState>* N) {
|
||||
assert (isa<BlockEntrance>(N->getLocation()));
|
||||
|
@ -313,8 +328,6 @@ void BugReporter::GeneratePathDiagnostic(PathDiagnostic& PD,
|
|||
os << V.toString();
|
||||
}
|
||||
|
||||
|
||||
|
||||
os << ":' at line "
|
||||
<< SMgr.getLogicalLineNumber(S->getLocStart()) << ".\n";
|
||||
|
||||
|
@ -323,17 +336,22 @@ void BugReporter::GeneratePathDiagnostic(PathDiagnostic& PD,
|
|||
}
|
||||
}
|
||||
else {
|
||||
|
||||
// FIXME: Get line number.
|
||||
|
||||
os << "'Default' branch taken. "
|
||||
"Execution continues after switch statement.";
|
||||
os << "'Default' branch taken.";
|
||||
ExecutionContinues(os, SMgr, LastNode);
|
||||
}
|
||||
|
||||
PD.push_front(new PathDiagnosticPiece(L, os.str()));
|
||||
break;
|
||||
}
|
||||
|
||||
case Stmt::BreakStmtClass:
|
||||
case Stmt::ContinueStmtClass: {
|
||||
std::ostringstream os;
|
||||
ExecutionContinues(os, SMgr, LastNode);
|
||||
PD.push_front(new PathDiagnosticPiece(L, os.str()));
|
||||
break;
|
||||
}
|
||||
|
||||
case Stmt::ConditionalOperatorClass: {
|
||||
|
||||
std::ostringstream os;
|
||||
|
|
Загрузка…
Ссылка в новой задаче