diff --git a/lib/checkautovariables.cpp b/lib/checkautovariables.cpp index 83b54ad7e..c12efa50b 100644 --- a/lib/checkautovariables.cpp +++ b/lib/checkautovariables.cpp @@ -90,6 +90,9 @@ static bool checkRvalueExpression(const Token * const vartok) const Token * const next = vartok->next(); + if (Token::Match(vartok->previous(), "& %var% [") && var->isPointer()) + return false; + // &a.b[0] if (Token::Match(vartok, "%var% . %var% [") && !var->isPointer()) { const Variable *var2 = next->next()->variable(); diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 22014eb4d..07b5a5879 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -325,6 +325,19 @@ private: " *p = &a.data[0];\n" "}"); ASSERT_EQUALS("[test.cpp:6]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + + // #4998 + check("void f(s8**out) {\n" + " s8 *p;\n" // <- p is pointer => no error + " *out = &p[1];\n" + "}"); + ASSERT_EQUALS("", errout.str()); + + check("void f(s8**out) {\n" + " s8 p[10];\n" // <- p is array => error + " *out = &p[1];\n" + "}"); + ASSERT_EQUALS("[test.cpp:3]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); } void testautovar12() { // Ticket #5024 - Crash on invalid input