diff --git a/lib/checkfunctions.cpp b/lib/checkfunctions.cpp index 1bb300005..9a485cb66 100644 --- a/lib/checkfunctions.cpp +++ b/lib/checkfunctions.cpp @@ -130,7 +130,9 @@ void CheckFunctions::invalidFunctionUsage() if (Token::Match(argtok, "& %var% !![") && argtok->next() && argtok->next()->valueType()) { const ValueType * valueType = argtok->next()->valueType(); const Variable * variable = argtok->next()->variable(); - if (valueType->type == ValueType::Type::CHAR && !variable->isArray() && (variable->isConst() || !variable->isGlobal()) && + if ( (valueType->type == ValueType::Type::CHAR|| (valueType->type == ValueType::Type::RECORD && Token::Match(argtok, "& %var% . %var% !!["))) && + !variable->isArray() && + (variable->isConst() || !variable->isGlobal()) && (!argtok->next()->hasKnownValue() || argtok->next()->getValue(0) == nullptr)) { invalidFunctionArgStrError(argtok, functionToken->str(), argnr); } diff --git a/test/testfunctions.cpp b/test/testfunctions.cpp index bb2754b33..ab84d1c6a 100644 --- a/test/testfunctions.cpp +++ b/test/testfunctions.cpp @@ -576,7 +576,8 @@ private: " size_t l2 = strlen(&s2.x);\n" " return l1 + l2;\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:9]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", "", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n" + "[test.cpp:9]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout.str()); check("const char x = 'x'; size_t f() { return strlen(&x); }"); ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout.str());