Improve unreachableCodeError message (#4559)
* Update templatesimplifier.cpp * Add tests * Improve unreachableCodeError message * Update templatesimplifier.cpp * Add tests * Improve unreachableCodeError message * Revert "Update templatesimplifier.cpp" This reverts commit 3fd152ed4063772a5f162bd985c3d91bcc65eb55. * Revert "Add tests" This reverts commit e760ab51e66a0a2c3a0250caf4cf3b745db44d10.
This commit is contained in:
parent
192c30ab1d
commit
9c7b4c9540
|
@ -825,7 +825,7 @@ void CheckOther::checkUnreachableCode()
|
||||||
secondBreak = silencedWarning;
|
secondBreak = silencedWarning;
|
||||||
|
|
||||||
if (!labelInFollowingLoop && !silencedCompilerWarningOnly)
|
if (!labelInFollowingLoop && !silencedCompilerWarningOnly)
|
||||||
unreachableCodeError(secondBreak, inconclusive);
|
unreachableCodeError(secondBreak, tok, inconclusive);
|
||||||
tok = Token::findmatch(secondBreak, "[}:]");
|
tok = Token::findmatch(secondBreak, "[}:]");
|
||||||
} else if (secondBreak->scope() && secondBreak->scope()->isLoopScope() && secondBreak->str() == "}" && tok->str() == "continue") {
|
} else if (secondBreak->scope() && secondBreak->scope()->isLoopScope() && secondBreak->str() == "}" && tok->str() == "continue") {
|
||||||
redundantContinueError(tok);
|
redundantContinueError(tok);
|
||||||
|
@ -849,10 +849,18 @@ void CheckOther::duplicateBreakError(const Token *tok, bool inconclusive)
|
||||||
"The second statement can never be executed, and so should be removed.", CWE561, inconclusive ? Certainty::inconclusive : Certainty::normal);
|
"The second statement can never be executed, and so should be removed.", CWE561, inconclusive ? Certainty::inconclusive : Certainty::normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::unreachableCodeError(const Token *tok, bool inconclusive)
|
void CheckOther::unreachableCodeError(const Token *tok, const Token* noreturn, bool inconclusive)
|
||||||
{
|
{
|
||||||
|
std::string msg = "Statements following ";
|
||||||
|
if (noreturn && noreturn->function())
|
||||||
|
msg += "noreturn function '" + noreturn->str() + "()'";
|
||||||
|
else if (noreturn && noreturn->isKeyword())
|
||||||
|
msg += "'" + noreturn->str() + "'";
|
||||||
|
else
|
||||||
|
msg += "return, break, continue, goto or throw";
|
||||||
|
msg += " will never be executed.";
|
||||||
reportError(tok, Severity::style, "unreachableCode",
|
reportError(tok, Severity::style, "unreachableCode",
|
||||||
"Statements following return, break, continue, goto or throw will never be executed.", CWE561, inconclusive ? Certainty::inconclusive : Certainty::normal);
|
msg, CWE561, inconclusive ? Certainty::inconclusive : Certainty::normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::redundantContinueError(const Token *tok)
|
void CheckOther::redundantContinueError(const Token *tok)
|
||||||
|
|
|
@ -259,7 +259,7 @@ private:
|
||||||
void duplicateValueTernaryError(const Token *tok);
|
void duplicateValueTernaryError(const Token *tok);
|
||||||
void duplicateExpressionTernaryError(const Token *tok, ErrorPath errors);
|
void duplicateExpressionTernaryError(const Token *tok, ErrorPath errors);
|
||||||
void duplicateBreakError(const Token *tok, bool inconclusive);
|
void duplicateBreakError(const Token *tok, bool inconclusive);
|
||||||
void unreachableCodeError(const Token* tok, bool inconclusive);
|
void unreachableCodeError(const Token* tok, const Token* noreturn, bool inconclusive);
|
||||||
void redundantContinueError(const Token* tok);
|
void redundantContinueError(const Token* tok);
|
||||||
void unsignedLessThanZeroError(const Token *tok, const ValueFlow::Value *v, const std::string &varname);
|
void unsignedLessThanZeroError(const Token *tok, const ValueFlow::Value *v, const std::string &varname);
|
||||||
void pointerLessThanZeroError(const Token *tok, const ValueFlow::Value *v);
|
void pointerLessThanZeroError(const Token *tok, const ValueFlow::Value *v);
|
||||||
|
@ -327,7 +327,7 @@ private:
|
||||||
c.duplicateValueTernaryError(nullptr);
|
c.duplicateValueTernaryError(nullptr);
|
||||||
c.duplicateExpressionTernaryError(nullptr, errorPath);
|
c.duplicateExpressionTernaryError(nullptr, errorPath);
|
||||||
c.duplicateBreakError(nullptr, false);
|
c.duplicateBreakError(nullptr, false);
|
||||||
c.unreachableCodeError(nullptr, false);
|
c.unreachableCodeError(nullptr, nullptr, false);
|
||||||
c.unsignedLessThanZeroError(nullptr, nullptr, "varname");
|
c.unsignedLessThanZeroError(nullptr, nullptr, "varname");
|
||||||
c.unsignedPositiveError(nullptr, nullptr, "varname");
|
c.unsignedPositiveError(nullptr, nullptr, "varname");
|
||||||
c.pointerLessThanZeroError(nullptr, nullptr);
|
c.pointerLessThanZeroError(nullptr, nullptr);
|
||||||
|
|
|
@ -4291,7 +4291,7 @@ private:
|
||||||
" return 0;\n"
|
" return 0;\n"
|
||||||
" foo();\n"
|
" foo();\n"
|
||||||
"}", nullptr, false, false, false);
|
"}", nullptr, false, false, false);
|
||||||
ASSERT_EQUALS("[test.cpp:3]: (style) Statements following return, break, continue, goto or throw will never be executed.\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:3]: (style) Statements following 'return' will never be executed.\n", errout.str());
|
||||||
|
|
||||||
check("int foo(int unused) {\n"
|
check("int foo(int unused) {\n"
|
||||||
" return 0;\n"
|
" return 0;\n"
|
||||||
|
@ -4312,7 +4312,7 @@ private:
|
||||||
" (void)unused2;\n"
|
" (void)unused2;\n"
|
||||||
" foo();\n"
|
" foo();\n"
|
||||||
"}", nullptr, false, false, false);
|
"}", nullptr, false, false, false);
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (style) Statements following return, break, continue, goto or throw will never be executed.\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (style) Statements following 'return' will never be executed.\n", errout.str());
|
||||||
|
|
||||||
check("int foo() {\n"
|
check("int foo() {\n"
|
||||||
" if(bar)\n"
|
" if(bar)\n"
|
||||||
|
@ -4349,7 +4349,7 @@ private:
|
||||||
" return 0;\n"
|
" return 0;\n"
|
||||||
" j=2;\n"
|
" j=2;\n"
|
||||||
"}", nullptr, false, false, false);
|
"}", nullptr, false, false, false);
|
||||||
ASSERT_EQUALS("[test.cpp:7]: (style) Statements following return, break, continue, goto or throw will never be executed.\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:7]: (style) Statements following 'return' will never be executed.\n", errout.str());
|
||||||
|
|
||||||
check("int foo() {\n"
|
check("int foo() {\n"
|
||||||
" return 0;\n"
|
" return 0;\n"
|
||||||
|
@ -4496,6 +4496,13 @@ private:
|
||||||
" return INB(port_1);\n"
|
" return INB(port_1);\n"
|
||||||
"}\n", "test.c");
|
"}\n", "test.c");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("[[noreturn]] void n();\n"
|
||||||
|
"void f() {\n"
|
||||||
|
" n();\n"
|
||||||
|
" g();\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:4]: (style) Statements following noreturn function 'n()' will never be executed.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void redundantContinue() {
|
void redundantContinue() {
|
||||||
|
|
Loading…
Reference in New Issue