simplify the alias handling in the checking of variable usage. Ticket: #1729
This commit is contained in:
parent
61e7e759f0
commit
7dba21858a
|
@ -437,8 +437,7 @@ public:
|
||||||
_type(type),
|
_type(type),
|
||||||
_read(read),
|
_read(read),
|
||||||
_write(write),
|
_write(write),
|
||||||
_modified(modified),
|
_modified(modified)
|
||||||
_noAlias(false)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -460,7 +459,6 @@ public:
|
||||||
bool _read;
|
bool _read;
|
||||||
bool _write;
|
bool _write;
|
||||||
bool _modified; // read/modify/write
|
bool _modified; // read/modify/write
|
||||||
bool _noAlias; // don't alias
|
|
||||||
std::set<unsigned int> _aliases;
|
std::set<unsigned int> _aliases;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -491,10 +489,7 @@ public:
|
||||||
}
|
}
|
||||||
void eraseAliases(unsigned int varid);
|
void eraseAliases(unsigned int varid);
|
||||||
void eraseAll(unsigned int varid);
|
void eraseAll(unsigned int varid);
|
||||||
|
void clearAliases(unsigned int varid);
|
||||||
// don't alias this variable because it's aliased to something undefined or unsupported
|
|
||||||
// or because it's aliased to something in a larger scope
|
|
||||||
void noAlias(unsigned int varid);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
VariableMap _varUsage;
|
VariableMap _varUsage;
|
||||||
|
@ -507,10 +502,7 @@ void Variables::alias(unsigned int varid1, unsigned int varid2)
|
||||||
{
|
{
|
||||||
VariableUsage *var = find(varid1);
|
VariableUsage *var = find(varid1);
|
||||||
if (var)
|
if (var)
|
||||||
{
|
|
||||||
var->_noAlias = false;
|
|
||||||
var->use();
|
var->use();
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -529,7 +521,6 @@ void Variables::alias(unsigned int varid1, unsigned int varid2)
|
||||||
|
|
||||||
// remove all aliases from var1
|
// remove all aliases from var1
|
||||||
var1->_aliases.clear();
|
var1->_aliases.clear();
|
||||||
var1->_noAlias = false;
|
|
||||||
|
|
||||||
VariableUsage *var2 = find(varid2);
|
VariableUsage *var2 = find(varid2);
|
||||||
|
|
||||||
|
@ -548,6 +539,28 @@ void Variables::alias(unsigned int varid1, unsigned int varid2)
|
||||||
var2->_read = true;
|
var2->_read = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Variables::clearAliases(unsigned int varid)
|
||||||
|
{
|
||||||
|
VariableUsage *usage = find(varid);
|
||||||
|
|
||||||
|
if (usage)
|
||||||
|
{
|
||||||
|
// remove usage from all aliases
|
||||||
|
std::set<unsigned int>::iterator i;
|
||||||
|
|
||||||
|
for (i = usage->_aliases.begin(); i != usage->_aliases.end(); ++i)
|
||||||
|
{
|
||||||
|
VariableUsage *temp = find(*i);
|
||||||
|
|
||||||
|
if (temp)
|
||||||
|
temp->_aliases.erase(usage->_name->varId());
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove all aliases from usage
|
||||||
|
usage->_aliases.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Variables::eraseAliases(unsigned int varid)
|
void Variables::eraseAliases(unsigned int varid)
|
||||||
{
|
{
|
||||||
VariableUsage *usage = find(varid);
|
VariableUsage *usage = find(varid);
|
||||||
|
@ -567,14 +580,6 @@ void Variables::eraseAll(unsigned int varid)
|
||||||
erase(varid);
|
erase(varid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Variables::noAlias(unsigned int varid)
|
|
||||||
{
|
|
||||||
VariableUsage *usage = find(varid);
|
|
||||||
|
|
||||||
if (usage)
|
|
||||||
usage->_noAlias = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Variables::addVar(const Token *name,
|
void Variables::addVar(const Token *name,
|
||||||
VariableType type,
|
VariableType type,
|
||||||
bool write_)
|
bool write_)
|
||||||
|
@ -595,8 +600,6 @@ void Variables::readAliases(unsigned int varid)
|
||||||
VariableUsage *usage = find(varid);
|
VariableUsage *usage = find(varid);
|
||||||
|
|
||||||
if (usage)
|
if (usage)
|
||||||
{
|
|
||||||
if (!usage->_noAlias)
|
|
||||||
{
|
{
|
||||||
std::set<unsigned int>::iterator aliases;
|
std::set<unsigned int>::iterator aliases;
|
||||||
|
|
||||||
|
@ -608,7 +611,6 @@ void Variables::readAliases(unsigned int varid)
|
||||||
aliased->_read = true;
|
aliased->_read = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Variables::readAll(unsigned int varid)
|
void Variables::readAll(unsigned int varid)
|
||||||
|
@ -619,8 +621,6 @@ void Variables::readAll(unsigned int varid)
|
||||||
{
|
{
|
||||||
usage->_read = true;
|
usage->_read = true;
|
||||||
|
|
||||||
if (!usage->_noAlias)
|
|
||||||
{
|
|
||||||
std::set<unsigned int>::iterator aliases;
|
std::set<unsigned int>::iterator aliases;
|
||||||
|
|
||||||
for (aliases = usage->_aliases.begin(); aliases != usage->_aliases.end(); ++aliases)
|
for (aliases = usage->_aliases.begin(); aliases != usage->_aliases.end(); ++aliases)
|
||||||
|
@ -631,7 +631,6 @@ void Variables::readAll(unsigned int varid)
|
||||||
aliased->_read = true;
|
aliased->_read = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Variables::write(unsigned int varid)
|
void Variables::write(unsigned int varid)
|
||||||
|
@ -647,8 +646,6 @@ void Variables::writeAliases(unsigned int varid)
|
||||||
VariableUsage *usage = find(varid);
|
VariableUsage *usage = find(varid);
|
||||||
|
|
||||||
if (usage)
|
if (usage)
|
||||||
{
|
|
||||||
if (!usage->_noAlias)
|
|
||||||
{
|
{
|
||||||
std::set<unsigned int>::iterator aliases;
|
std::set<unsigned int>::iterator aliases;
|
||||||
|
|
||||||
|
@ -660,7 +657,6 @@ void Variables::writeAliases(unsigned int varid)
|
||||||
aliased->_write = true;
|
aliased->_write = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Variables::writeAll(unsigned int varid)
|
void Variables::writeAll(unsigned int varid)
|
||||||
|
@ -671,8 +667,6 @@ void Variables::writeAll(unsigned int varid)
|
||||||
{
|
{
|
||||||
usage->_write = true;
|
usage->_write = true;
|
||||||
|
|
||||||
if (!usage->_noAlias)
|
|
||||||
{
|
|
||||||
std::set<unsigned int>::iterator aliases;
|
std::set<unsigned int>::iterator aliases;
|
||||||
|
|
||||||
for (aliases = usage->_aliases.begin(); aliases != usage->_aliases.end(); ++aliases)
|
for (aliases = usage->_aliases.begin(); aliases != usage->_aliases.end(); ++aliases)
|
||||||
|
@ -683,7 +677,6 @@ void Variables::writeAll(unsigned int varid)
|
||||||
aliased->_write = true;
|
aliased->_write = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Variables::use(unsigned int varid)
|
void Variables::use(unsigned int varid)
|
||||||
|
@ -694,8 +687,6 @@ void Variables::use(unsigned int varid)
|
||||||
{
|
{
|
||||||
usage->use();
|
usage->use();
|
||||||
|
|
||||||
if (!usage->_noAlias)
|
|
||||||
{
|
|
||||||
std::set<unsigned int>::iterator aliases;
|
std::set<unsigned int>::iterator aliases;
|
||||||
|
|
||||||
for (aliases = usage->_aliases.begin(); aliases != usage->_aliases.end(); ++aliases)
|
for (aliases = usage->_aliases.begin(); aliases != usage->_aliases.end(); ++aliases)
|
||||||
|
@ -706,7 +697,6 @@ void Variables::use(unsigned int varid)
|
||||||
aliased->use();
|
aliased->use();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Variables::modified(unsigned int varid)
|
void Variables::modified(unsigned int varid)
|
||||||
|
@ -717,8 +707,6 @@ void Variables::modified(unsigned int varid)
|
||||||
{
|
{
|
||||||
usage->_modified = true;
|
usage->_modified = true;
|
||||||
|
|
||||||
if (!usage->_noAlias)
|
|
||||||
{
|
|
||||||
std::set<unsigned int>::iterator aliases;
|
std::set<unsigned int>::iterator aliases;
|
||||||
|
|
||||||
for (aliases = usage->_aliases.begin(); aliases != usage->_aliases.end(); ++aliases)
|
for (aliases = usage->_aliases.begin(); aliases != usage->_aliases.end(); ++aliases)
|
||||||
|
@ -729,7 +717,6 @@ void Variables::modified(unsigned int varid)
|
||||||
aliased->_modified = true;
|
aliased->_modified = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Variables::VariableUsage *Variables::find(unsigned int varid)
|
Variables::VariableUsage *Variables::find(unsigned int varid)
|
||||||
|
@ -884,7 +871,7 @@ static int doAssignment(Variables &variables, const Token *tok, bool pointer, bo
|
||||||
if (var1->_type == Variables::pointer && !pointer)
|
if (var1->_type == Variables::pointer && !pointer)
|
||||||
{
|
{
|
||||||
// aliased variables in a larger scope are not supported
|
// aliased variables in a larger scope are not supported
|
||||||
var1->_noAlias = true;
|
variables.clearAliases(varid1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1605,6 +1605,33 @@ private:
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (style) Unused variable: a\n"
|
ASSERT_EQUALS("[test.cpp:4]: (style) Unused variable: a\n"
|
||||||
"[test.cpp:5]: (style) Variable 's' is assigned a value that is never used\n", errout.str());
|
"[test.cpp:5]: (style) Variable 's' is assigned a value that is never used\n", errout.str());
|
||||||
|
|
||||||
|
functionVariableUsage("int a[10];\n"
|
||||||
|
"void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" int b[10];\n"
|
||||||
|
" int c[10];\n"
|
||||||
|
" int *d;\n"
|
||||||
|
" d = b;\n"
|
||||||
|
" d = a;\n"
|
||||||
|
" d = c;\n"
|
||||||
|
" *d = 0;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS(std::string("[test.cpp:4]: (style) Unused variable: b\n"
|
||||||
|
"[test.cpp:5]: (style) Variable 'c' is assigned a value that is never used\n"), errout.str());
|
||||||
|
|
||||||
|
functionVariableUsage("int a[10];\n"
|
||||||
|
"void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" int b[10];\n"
|
||||||
|
" int c[10];\n"
|
||||||
|
" int *d;\n"
|
||||||
|
" d = b; *d = 0;\n"
|
||||||
|
" d = a; *d = 0;\n"
|
||||||
|
" d = c; *d = 0;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS(std::string("[test.cpp:4]: (style) Variable 'b' is assigned a value that is never used\n"
|
||||||
|
"[test.cpp:5]: (style) Variable 'c' is assigned a value that is never used\n"), errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void localvaralias2() // ticket 1637
|
void localvaralias2() // ticket 1637
|
||||||
|
|
Loading…
Reference in New Issue