false positive: Variable is assigned a value that is never used
This commit is contained in:
parent
8f76aea6ed
commit
048733a15e
|
@ -985,6 +985,11 @@ void CheckOther::functionVariableUsage()
|
||||||
{
|
{
|
||||||
variables.addVar(tok->tokAt(2), Variables::array,
|
variables.addVar(tok->tokAt(2), Variables::array,
|
||||||
tok->tokAt(6)->str() == "=");
|
tok->tokAt(6)->str() == "=");
|
||||||
|
|
||||||
|
// check for reading array size from local variable
|
||||||
|
if (tok->tokAt(4)->varId() != 0)
|
||||||
|
variables.read(tok->tokAt(4)->varId());
|
||||||
|
|
||||||
tok = tok->tokAt(5);
|
tok = tok->tokAt(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1182,6 +1187,11 @@ void CheckOther::functionVariableUsage()
|
||||||
variables.addVar(tok->tokAt(3),
|
variables.addVar(tok->tokAt(3),
|
||||||
tok->tokAt(2)->str() == "*" ? Variables::pointerArray : Variables::referenceArray,
|
tok->tokAt(2)->str() == "*" ? Variables::pointerArray : Variables::referenceArray,
|
||||||
tok->tokAt(7)->str() == "=");
|
tok->tokAt(7)->str() == "=");
|
||||||
|
|
||||||
|
// check for reading array size from local variable
|
||||||
|
if (tok->tokAt(5)->varId() != 0)
|
||||||
|
variables.read(tok->tokAt(5)->varId());
|
||||||
|
|
||||||
tok = tok->tokAt(6);
|
tok = tok->tokAt(6);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1193,6 +1203,11 @@ void CheckOther::functionVariableUsage()
|
||||||
variables.addVar(tok->tokAt(4),
|
variables.addVar(tok->tokAt(4),
|
||||||
tok->tokAt(3)->str() == "*" ? Variables::pointerArray : Variables::referenceArray,
|
tok->tokAt(3)->str() == "*" ? Variables::pointerArray : Variables::referenceArray,
|
||||||
tok->tokAt(8)->str() == "=");
|
tok->tokAt(8)->str() == "=");
|
||||||
|
|
||||||
|
// check for reading array size from local variable
|
||||||
|
if (tok->tokAt(6)->varId() != 0)
|
||||||
|
variables.read(tok->tokAt(6)->varId());
|
||||||
|
|
||||||
tok = tok->tokAt(7);
|
tok = tok->tokAt(7);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1203,7 +1218,12 @@ void CheckOther::functionVariableUsage()
|
||||||
variables.addVar(tok->tokAt(4),
|
variables.addVar(tok->tokAt(4),
|
||||||
tok->tokAt(3)->str() == "*" ? Variables::pointerArray : Variables::referenceArray,
|
tok->tokAt(3)->str() == "*" ? Variables::pointerArray : Variables::referenceArray,
|
||||||
tok->tokAt(8)->str() == "=");
|
tok->tokAt(8)->str() == "=");
|
||||||
tok = tok->tokAt(6);
|
|
||||||
|
// check for reading array size from local variable
|
||||||
|
if (tok->tokAt(6)->varId() != 0)
|
||||||
|
variables.read(tok->tokAt(6)->varId());
|
||||||
|
|
||||||
|
tok = tok->tokAt(7);
|
||||||
}
|
}
|
||||||
|
|
||||||
// const array of pointer or reference of struct or union declaration with possible initialization
|
// const array of pointer or reference of struct or union declaration with possible initialization
|
||||||
|
@ -1213,7 +1233,12 @@ void CheckOther::functionVariableUsage()
|
||||||
variables.addVar(tok->tokAt(5),
|
variables.addVar(tok->tokAt(5),
|
||||||
tok->tokAt(4)->str() == "*" ? Variables::pointerArray : Variables::referenceArray,
|
tok->tokAt(4)->str() == "*" ? Variables::pointerArray : Variables::referenceArray,
|
||||||
tok->tokAt(9)->str() == "=");
|
tok->tokAt(9)->str() == "=");
|
||||||
tok = tok->tokAt(7);
|
|
||||||
|
// check for reading array size from local variable
|
||||||
|
if (tok->tokAt(7)->varId() != 0)
|
||||||
|
variables.read(tok->tokAt(7)->varId());
|
||||||
|
|
||||||
|
tok = tok->tokAt(8);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (Token::Match(tok, "delete|return %var%"))
|
else if (Token::Match(tok, "delete|return %var%"))
|
||||||
|
|
|
@ -77,6 +77,7 @@ private:
|
||||||
TEST_CASE(localvar12);
|
TEST_CASE(localvar12);
|
||||||
TEST_CASE(localvar13); // ticket #1640
|
TEST_CASE(localvar13); // ticket #1640
|
||||||
TEST_CASE(localvar14); // ticket #5
|
TEST_CASE(localvar14); // ticket #5
|
||||||
|
TEST_CASE(localvar15);
|
||||||
TEST_CASE(localvaralias1);
|
TEST_CASE(localvaralias1);
|
||||||
TEST_CASE(localvaralias2); // ticket #1637
|
TEST_CASE(localvaralias2); // ticket #1637
|
||||||
TEST_CASE(localvaralias3); // ticket #1639
|
TEST_CASE(localvaralias3); // ticket #1639
|
||||||
|
@ -1061,6 +1062,64 @@ private:
|
||||||
ASSERT_EQUALS("[test.cpp:3]: (style) Unused variable: a\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:3]: (style) Unused variable: a\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void localvar15()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
functionVariableUsage("int foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" int a = 5;\n"
|
||||||
|
" int b[a];\n"
|
||||||
|
" b[0] = 0;\n"
|
||||||
|
" return b[0];\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
functionVariableUsage("int foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" int a = 5;\n"
|
||||||
|
" int * b[a];\n"
|
||||||
|
" b[0] = &c;\n"
|
||||||
|
" return *b[0];\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
functionVariableUsage("int * foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" int a = 5;\n"
|
||||||
|
" const int * b[a];\n"
|
||||||
|
" b[0] = &c;\n"
|
||||||
|
" return b[0];\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
functionVariableUsage("struct B * foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" int a = 5;\n"
|
||||||
|
" struct B * b[a];\n"
|
||||||
|
" b[0] = &c;\n"
|
||||||
|
" return b[0];\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
functionVariableUsage("const struct B * foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" int a = 5;\n"
|
||||||
|
" const struct B * b[a];\n"
|
||||||
|
" b[0] = &c;\n"
|
||||||
|
" return b[0];\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void localvaralias1()
|
void localvaralias1()
|
||||||
{
|
{
|
||||||
functionVariableUsage("void foo()\n"
|
functionVariableUsage("void foo()\n"
|
||||||
|
|
Loading…
Reference in New Issue