Fixed #7778 (valueFlowAfterAssign: alias)
This commit is contained in:
parent
21364b4401
commit
d40f4e4a55
|
@ -1800,8 +1800,15 @@ static void valueFlowAfterAssign(TokenList *tokenlist, SymbolDatabase* symboldat
|
|||
{
|
||||
const std::size_t functions = symboldatabase->functionScopes.size();
|
||||
for (std::size_t i = 0; i < functions; ++i) {
|
||||
std::set<unsigned int> aliased;
|
||||
const Scope * scope = symboldatabase->functionScopes[i];
|
||||
for (Token* tok = const_cast<Token*>(scope->classStart); tok != scope->classEnd; tok = tok->next()) {
|
||||
// Alias
|
||||
if (tok->str() == "&" && !tok->astOperand2() && tok->astOperand1()) {
|
||||
aliased.insert(tok->astOperand1()->varId());
|
||||
continue;
|
||||
}
|
||||
|
||||
// Assignment
|
||||
if ((tok->str() != "=") || (tok->astParent()))
|
||||
continue;
|
||||
|
@ -1810,6 +1817,8 @@ static void valueFlowAfterAssign(TokenList *tokenlist, SymbolDatabase* symboldat
|
|||
if (!tok->astOperand1() || !tok->astOperand1()->varId())
|
||||
continue;
|
||||
const unsigned int varid = tok->astOperand1()->varId();
|
||||
if (aliased.find(varid) != aliased.end())
|
||||
continue;
|
||||
const Variable *var = tok->astOperand1()->variable();
|
||||
if (!var || (!var->isLocal() && !var->isArgument()))
|
||||
continue;
|
||||
|
|
|
@ -1342,6 +1342,17 @@ private:
|
|||
" }\n"
|
||||
"}\n";
|
||||
ASSERT_EQUALS(false, testValueOfX(code, 3U, 0));
|
||||
|
||||
// alias
|
||||
code = "void f() {\n" // #7778
|
||||
" int x = 0;\n"
|
||||
" int *p = &x;\n"
|
||||
" x = 3;\n"
|
||||
" *p = 2;\n"
|
||||
" a = x;\n"
|
||||
"}\n";
|
||||
ASSERT_EQUALS(false, testValueOfX(code, 6U, 3));
|
||||
TODO_ASSERT_EQUALS(true, false, testValueOfX(code, 6U, 2));
|
||||
}
|
||||
|
||||
void valueFlowAfterCondition() {
|
||||
|
|
Loading…
Reference in New Issue