diff --git a/lib/checkautovariables.cpp b/lib/checkautovariables.cpp index c164643594d..d476db0e8af 100644 --- a/lib/checkautovariables.cpp +++ b/lib/checkautovariables.cpp @@ -265,11 +265,17 @@ static bool hasOverloadedAssignment(const Token* tok, bool& inconclusive) static bool isMemberAssignment(const Token* tok, const Token*& rhs, const Settings& settings) { - if (!Token::Match(tok, "[;{}] %var% . %var%")) - return false; + const Token *endBracket = nullptr; + if (!Token::Match(tok, "[;{}] %var% . %var%")) { + if (!Token::Match(tok, "[;{}] %var% [")) + return false; + endBracket = tok->linkAt(2); + if (!Token::Match(endBracket, "] . %var%")) + return false; + } if (!isPtrArg(tok->next())) return false; - const Token* assign = tok->tokAt(2)->astParent(); + const Token* assign = (endBracket ? endBracket->next() : tok->tokAt(2))->astParent(); while (Token::simpleMatch(assign, "[")) assign = assign->astParent(); if (!Token::simpleMatch(assign, "=")) diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 6c1267ae288..5cbbfd14b7a 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -69,6 +69,7 @@ class TestAutoVariables : public TestFixture { TEST_CASE(testautovar15); // ticket #6538 TEST_CASE(testautovar16); // ticket #8114 TEST_CASE(testautovar17); + TEST_CASE(testautovar18); TEST_CASE(testautovar_array1); TEST_CASE(testautovar_array2); TEST_CASE(testautovar_array3); @@ -516,6 +517,15 @@ class TestAutoVariables : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void testautovar18() { + check("struct S { int* p; };\n" + "void foo(struct S* s) {\n" + " int x;\n" + " s[2].p = &x;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:4:5]: (error) Address of local auto-variable assigned to a function parameter. [autoVariables]\n", errout_str()); + } + void testautovar_array1() { check("void func1(int* arr[2])\n" "{\n"