From 4e64d354621ae20c0581fe8c0305262e31d1772f Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Thu, 21 Jul 2011 22:26:42 -0400 Subject: [PATCH] fix #2926 (false negative in auto variables checking when function parameter is a struct) --- lib/checkautovariables.cpp | 10 ++++++++++ test/testautovariables.cpp | 11 +++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/checkautovariables.cpp b/lib/checkautovariables.cpp index 1d648e120..b2712afd8 100644 --- a/lib/checkautovariables.cpp +++ b/lib/checkautovariables.cpp @@ -101,6 +101,16 @@ void CheckAutoVariables::autoVariables() if (var && (!var->isClass() || var->type())) errorAutoVariableAssignment(tok); } + else if (Token::Match(tok, "[;{}] %var% . %var% = & %var%")) + { + const Variable * var1 = symbolDatabase->getVariableFromVarId(tok->tokAt(1)->varId()); + if (var1 && var1->isArgument() && Token::Match(var1->nameToken()->tokAt(-2), "%type% *")) + { + const Variable * var2 = symbolDatabase->getVariableFromVarId(tok->tokAt(6)->varId()); + if (var2 && var2->isLocal() && !var2->isStatic()) + errorAutoVariableAssignment(tok); + } + } else if (Token::Match(tok, "[;{}] * %var% = %var% ;")) { const Variable * var1 = symbolDatabase->getVariableFromVarId(tok->tokAt(2)->varId()); diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 1837ac707..92a5496f6 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -71,6 +71,7 @@ private: TEST_CASE(testautovar2); TEST_CASE(testautovar3); // ticket #2925 TEST_CASE(testautovar4); // ticket #2928 + TEST_CASE(testautovar5); // ticket #2926 TEST_CASE(testautovar_array1); TEST_CASE(testautovar_array2); TEST_CASE(testautovar_return1); @@ -175,6 +176,16 @@ private: ASSERT_EQUALS("", errout.str()); } + void testautovar5() // ticket #2926 + { + check("void foo(struct AB *ab)\n" + "{\n" + " char a;\n" + " ab->a = &a;\n" + "}"); + ASSERT_EQUALS("[test.cpp:3]: (error) Assigning address of local auto-variable to a function parameter.\n", errout.str()); + } + void testautovar_array1() { check("void func1(int* arr[2])\n"