From d40f4e4a554cd181cbce79bb82934c6cccbed785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 21 Nov 2016 17:26:36 +0100 Subject: [PATCH] Fixed #7778 (valueFlowAfterAssign: alias) --- lib/valueflow.cpp | 9 +++++++++ test/testvalueflow.cpp | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 6d45d1aa3..d87be4b77 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -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 aliased; const Scope * scope = symboldatabase->functionScopes[i]; for (Token* tok = const_cast(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; diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index df5ee8bff..4d82e39d2 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -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() {