diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 2d53ef0b0c1..aeee7a372e1 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -2636,7 +2636,8 @@ bool isVariableChanged(const Token *tok, int indirect, const Settings &settings, while ((tok2->astParent() && tok2->astParent()->isUnaryOp("*")) || (Token::simpleMatch(tok2->astParent(), ".") && !Token::Match(tok2->astParent()->astParent(), "[(,]")) || (tok2->astParent() && tok2->astParent()->isUnaryOp("&") && Token::simpleMatch(tok2->astParent()->astParent(), ".") && tok2->astParent()->astParent()->originalName()=="->") || - (Token::simpleMatch(tok2->astParent(), "[") && tok2 == tok2->astParent()->astOperand1())) { + (Token::simpleMatch(tok2->astParent(), "[") && tok2 == tok2->astParent()->astOperand1()) || + (Token::simpleMatch(tok2->astParent(), "(") && tok2->astParent()->isCast())) { if (tok2->astParent() && (tok2->astParent()->isUnaryOp("*") || (astIsLHS(tok2) && tok2->astParent()->originalName() == "->" && !hasOverloadedMemberAccess(tok2)))) derefs++; if (derefs > indirect) diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 62be497638a..ecb467524c3 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -6696,6 +6696,18 @@ class TestUninitVar : public TestFixture { " return [&]() { return j; }();\n" "}\n"); ASSERT_EQUALS("[test.cpp:17:27]: (error) Uninitialized variable: j [uninitvar]\n", errout_str()); + + valueFlowUninit("int f() {\n" // #14582 + " int a[1];\n" + " static_cast(a)[0] = 0;\n" + " return a[0];\n" + "}\n" + "int g() {\n" + " int a[1];\n" + " ((int*)a)[0] = 0;\n" + " return a[0];\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void valueFlowUninitBreak() { // Do not show duplicate warnings about the same uninitialized value