Fixed #1792 (false positive: Variable 'test' is assigned a value that is never used)
This commit is contained in:
parent
cb7e9fbec1
commit
98ae660260
|
@ -1378,6 +1378,9 @@ void CheckOther::functionVariableUsage()
|
|||
const Variables::VariableUsage &usage = it->second;
|
||||
const std::string &varname = usage._name->str();
|
||||
|
||||
if (usage._name->isUnused())
|
||||
continue;
|
||||
|
||||
if (usage.unused() && !usage._modified)
|
||||
unusedVariableError(usage._name, varname);
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@ Token::Token(Token **t) :
|
|||
_isUnsigned(false),
|
||||
_isSigned(false),
|
||||
_isLong(false),
|
||||
_isUnused(false),
|
||||
_varId(0),
|
||||
_next(0),
|
||||
_previous(0),
|
||||
|
|
|
@ -172,6 +172,14 @@ public:
|
|||
{
|
||||
_isLong = size;
|
||||
}
|
||||
bool isUnused() const
|
||||
{
|
||||
return _isUnused;
|
||||
}
|
||||
void isUnused(bool used)
|
||||
{
|
||||
_isUnused = used;
|
||||
}
|
||||
bool isStandardType() const;
|
||||
bool isIntegerType() const;
|
||||
|
||||
|
@ -368,6 +376,7 @@ private:
|
|||
bool _isUnsigned;
|
||||
bool _isSigned;
|
||||
bool _isLong;
|
||||
bool _isUnused;
|
||||
unsigned int _varId;
|
||||
Token *_next;
|
||||
Token *_previous;
|
||||
|
|
|
@ -172,6 +172,7 @@ void Tokenizer::addtoken(const Token * tok, const unsigned int lineno, const uns
|
|||
_tokensBack->isUnsigned(tok->isUnsigned());
|
||||
_tokensBack->isSigned(tok->isSigned());
|
||||
_tokensBack->isLong(tok->isLong());
|
||||
_tokensBack->isUnused(tok->isUnused());
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
@ -7678,6 +7679,16 @@ void Tokenizer::simplifyAttribute()
|
|||
{
|
||||
if (Token::simpleMatch(tok, "__attribute__ (") && tok->next()->link() && tok->next()->link()->next())
|
||||
{
|
||||
if (Token::simpleMatch(tok->tokAt(2), "( unused )"))
|
||||
{
|
||||
// check if after variable name
|
||||
if (Token::Match(tok->next()->link()->next(), ";|="))
|
||||
{
|
||||
if (Token::Match(tok->previous(), "%type%"))
|
||||
tok->previous()->isUnused(true);
|
||||
}
|
||||
}
|
||||
|
||||
Token::eraseTokens(tok, tok->next()->link()->next());
|
||||
tok->deleteThis();
|
||||
}
|
||||
|
|
|
@ -105,6 +105,7 @@ private:
|
|||
TEST_CASE(localvarShift); // 1 >> var
|
||||
TEST_CASE(localvarCast);
|
||||
TEST_CASE(localvarClass);
|
||||
TEST_CASE(localvarUnused);
|
||||
}
|
||||
|
||||
void structmember1()
|
||||
|
@ -1893,6 +1894,21 @@ private:
|
|||
"}\n");
|
||||
ASSERT_EQUALS(std::string(""), errout.str());
|
||||
}
|
||||
|
||||
void localvarUnused()
|
||||
{
|
||||
functionVariableUsage("int foo()\n"
|
||||
"{\n"
|
||||
" bool test __attribute__((unused));\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS(std::string(""), errout.str());
|
||||
|
||||
functionVariableUsage("int foo()\n"
|
||||
"{\n"
|
||||
" bool test __attribute__((unused)) = true;\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS(std::string(""), errout.str());
|
||||
}
|
||||
};
|
||||
|
||||
REGISTER_TEST(TestUnusedVar)
|
||||
|
|
Loading…
Reference in New Issue