Fix issue 9351: false negative: (style) Condition '...' is always true (#2201)
This commit is contained in:
parent
32c89345f0
commit
a903aa7070
|
@ -1357,8 +1357,9 @@ void CheckCondition::alwaysTrueFalse()
|
|||
const bool compExpr = Token::Match(tok, "%comp%|!"); // a compare expression
|
||||
const bool returnStatement = Token::simpleMatch(tok->astTop(), "return") &&
|
||||
Token::Match(tok->astParent(), "%oror%|&&|return");
|
||||
const bool ternaryExpression = Token::simpleMatch(tok->astParent(), "?");
|
||||
|
||||
if (!(constIfWhileExpression || constValExpr || compExpr || returnStatement))
|
||||
if (!(constIfWhileExpression || constValExpr || compExpr || returnStatement || ternaryExpression))
|
||||
continue;
|
||||
|
||||
if (returnStatement && (!scope->function || !Token::simpleMatch(scope->function->retDef, "bool")))
|
||||
|
|
|
@ -4730,7 +4730,7 @@ static void valueFlowInferCondition(TokenList* tokenlist,
|
|||
continue;
|
||||
if (tok->hasKnownValue())
|
||||
continue;
|
||||
if (Token::Match(tok, "%var%") && (Token::Match(tok->astParent(), "&&|!|%oror%") ||
|
||||
if (Token::Match(tok, "%var%") && (Token::Match(tok->astParent(), "?|&&|!|%oror%") ||
|
||||
Token::Match(tok->astParent()->previous(), "if|while ("))) {
|
||||
const ValueFlow::Value* result = proveNotEqual(tok->values(), 0);
|
||||
if (!result)
|
||||
|
|
|
@ -3295,6 +3295,14 @@ private:
|
|||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// #9351
|
||||
check("int f(int x) {\n"
|
||||
" const bool b = x < 42;\n"
|
||||
" if(b) return b?0:-1;\n"
|
||||
" return 42;\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (style) Condition 'b' is always true\n", errout.str());
|
||||
|
||||
// #9362
|
||||
check("uint8_t g();\n"
|
||||
"void f() {\n"
|
||||
|
|
Loading…
Reference in New Issue