valueFlowAfterAssign: variable initialization
This commit is contained in:
parent
dc5e93a103
commit
2b0e4926bc
|
@ -3906,6 +3906,17 @@ static bool isLiteralNumber(const Token *tok, bool cpp)
|
||||||
return tok->isNumber() || tok->isEnumerator() || tok->str() == "NULL" || (cpp && Token::Match(tok, "false|true|nullptr"));
|
return tok->isNumber() || tok->isEnumerator() || tok->str() == "NULL" || (cpp && Token::Match(tok, "false|true|nullptr"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isVariableInit(const Token *tok)
|
||||||
|
{
|
||||||
|
return tok->str() == "(" &&
|
||||||
|
tok->isBinaryOp() &&
|
||||||
|
tok->astOperand1()->variable() &&
|
||||||
|
tok->astOperand1()->variable()->nameToken() == tok->astOperand1() &&
|
||||||
|
tok->astOperand1()->variable()->valueType() &&
|
||||||
|
tok->astOperand1()->variable()->valueType()->type >= ValueType::Type::VOID &&
|
||||||
|
!Token::simpleMatch(tok->astOperand2(), ",");
|
||||||
|
}
|
||||||
|
|
||||||
static void valueFlowAfterAssign(TokenList *tokenlist, SymbolDatabase* symboldatabase, ErrorLogger *errorLogger, const Settings *settings)
|
static void valueFlowAfterAssign(TokenList *tokenlist, SymbolDatabase* symboldatabase, ErrorLogger *errorLogger, const Settings *settings)
|
||||||
{
|
{
|
||||||
for (const Scope * scope : symboldatabase->functionScopes) {
|
for (const Scope * scope : symboldatabase->functionScopes) {
|
||||||
|
@ -3918,7 +3929,7 @@ static void valueFlowAfterAssign(TokenList *tokenlist, SymbolDatabase* symboldat
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assignment
|
// Assignment
|
||||||
if ((tok->str() != "=") || (tok->astParent()))
|
if ((tok->str() != "=" && !isVariableInit(tok)) || (tok->astParent()))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Lhs should be a variable
|
// Lhs should be a variable
|
||||||
|
|
|
@ -1505,6 +1505,12 @@ private:
|
||||||
"}";
|
"}";
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 3U, 123));
|
ASSERT_EQUALS(true, testValueOfX(code, 3U, 123));
|
||||||
|
|
||||||
|
code = "void f() {\n"
|
||||||
|
" const int x(321);\n"
|
||||||
|
" a = x;\n"
|
||||||
|
"}";
|
||||||
|
ASSERT_EQUALS(true, testValueOfX(code, 3U, 321));
|
||||||
|
|
||||||
code = "void f() {\n"
|
code = "void f() {\n"
|
||||||
" int x = 9;\n"
|
" int x = 9;\n"
|
||||||
" --x;\n"
|
" --x;\n"
|
||||||
|
|
Loading…
Reference in New Issue