parent
9e74da6126
commit
109a031ec7
|
@ -829,6 +829,9 @@ void CheckOther::checkUnreachableCode()
|
||||||
if (!labelInFollowingLoop && !silencedCompilerWarningOnly)
|
if (!labelInFollowingLoop && !silencedCompilerWarningOnly)
|
||||||
unreachableCodeError(secondBreak, inconclusive);
|
unreachableCodeError(secondBreak, inconclusive);
|
||||||
tok = Token::findmatch(secondBreak, "[}:]");
|
tok = Token::findmatch(secondBreak, "[}:]");
|
||||||
|
} else if (secondBreak->scope() && secondBreak->scope()->isLoopScope() && secondBreak->str() == "}" && tok->str() == "continue") {
|
||||||
|
redundantContinueError(tok);
|
||||||
|
tok = secondBreak;
|
||||||
} else
|
} else
|
||||||
tok = secondBreak;
|
tok = secondBreak;
|
||||||
|
|
||||||
|
@ -854,6 +857,12 @@ void CheckOther::unreachableCodeError(const Token *tok, bool inconclusive)
|
||||||
"Statements following return, break, continue, goto or throw will never be executed.", CWE561, inconclusive ? Certainty::inconclusive : Certainty::normal);
|
"Statements following return, break, continue, goto or throw will never be executed.", CWE561, inconclusive ? Certainty::inconclusive : Certainty::normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CheckOther::redundantContinueError(const Token *tok)
|
||||||
|
{
|
||||||
|
reportError(tok, Severity::style, "redundantContinue",
|
||||||
|
"'continue' is redundant since it is the last statement in a loop.", CWE561, Certainty::normal);
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Check scope of variables..
|
// Check scope of variables..
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
|
@ -260,6 +260,7 @@ private:
|
||||||
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, bool inconclusive);
|
||||||
|
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);
|
||||||
void unsignedPositiveError(const Token *tok, const ValueFlow::Value *v, const std::string &varname);
|
void unsignedPositiveError(const Token *tok, const ValueFlow::Value *v, const std::string &varname);
|
||||||
|
|
|
@ -117,6 +117,7 @@ private:
|
||||||
TEST_CASE(switchRedundantOperationTest);
|
TEST_CASE(switchRedundantOperationTest);
|
||||||
TEST_CASE(switchRedundantBitwiseOperationTest);
|
TEST_CASE(switchRedundantBitwiseOperationTest);
|
||||||
TEST_CASE(unreachableCode);
|
TEST_CASE(unreachableCode);
|
||||||
|
TEST_CASE(redundantContinue);
|
||||||
|
|
||||||
TEST_CASE(suspiciousCase);
|
TEST_CASE(suspiciousCase);
|
||||||
TEST_CASE(suspiciousEqualityComparison);
|
TEST_CASE(suspiciousEqualityComparison);
|
||||||
|
@ -4449,6 +4450,26 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void redundantContinue() {
|
||||||
|
check("void f() {\n" // #11195
|
||||||
|
" for (int i = 0; i < 10; ++i) {\n"
|
||||||
|
" printf(\"i = %d\\n\", i);\n"
|
||||||
|
" continue;\n"
|
||||||
|
" }\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:4]: (style) 'continue' is redundant since it is the last statement in a loop.\n", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" int i = 0;"
|
||||||
|
" do {\n"
|
||||||
|
" ++i;\n"
|
||||||
|
" printf(\"i = %d\\n\", i);\n"
|
||||||
|
" continue;\n"
|
||||||
|
" } while (i < 10);\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:5]: (style) 'continue' is redundant since it is the last statement in a loop.\n", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void suspiciousCase() {
|
void suspiciousCase() {
|
||||||
check("void foo() {\n"
|
check("void foo() {\n"
|
||||||
|
|
Loading…
Reference in New Issue