From dd155b57e4222b13e2a4849dde3c046a0bf49d46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Wed, 20 Mar 2013 06:38:53 +0100 Subject: [PATCH] Fixed #4487 (False positive: variable is not assigned a value (pointer alias)) --- lib/checkunusedvar.cpp | 10 ++++++++++ test/testunusedvar.cpp | 17 +++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 0844745f4..e429758f0 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -605,6 +605,16 @@ static const Token* doAssignment(Variables &variables, const Token *tok, bool de } } + // Possible pointer alias + else if (Token::Match(tok, "%var% = %var% ;")) { + const unsigned int varid2 = tok->tokAt(2)->varId(); + Variables::VariableUsage *var2 = variables.find(varid2); + if (var2 && (var2->_type == Variables::array || + var2->_type == Variables::pointer)) { + variables.use(varid2,tok); + } + } + return tok; } diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index f957c78e2..69114d4a2 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -104,6 +104,7 @@ private: TEST_CASE(localvaralias10); // ticket #2004 TEST_CASE(localvaralias11); // ticket #4423 - iterator TEST_CASE(localvaralias12); // ticket #4394 + TEST_CASE(localvaralias13); // ticket #4487 TEST_CASE(localvarasm); TEST_CASE(localvarstatic); TEST_CASE(localvarextern); @@ -2744,6 +2745,22 @@ private: ASSERT_EQUALS("", errout.str()); } + void localvaralias13() { // #4487 + functionVariableUsage("void f(char *p) {\n" + " char a[4];\n" + " p = a;\n" + " strcpy(p, \"x\");\n" + "}"); + ASSERT_EQUALS("", errout.str()); + + functionVariableUsage("void f(char *p) {\n" + " char a[4];\n" + " p = a;\n" + " strcpy(p, \"x\");\n" + "}"); + TODO_ASSERT_EQUALS("a is assigned value that is never used", "", errout.str()); + } + void localvarasm() { functionVariableUsage("void foo(int &b)\n" "{\n"