From 73ef4b815eb6af95b9aa366544623d29c82517fb Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 8 Mar 2023 13:15:23 +0100 Subject: [PATCH 1/2] Pass settings to isVariableChanged() --- lib/programmemory.cpp | 23 ++++++++++++----------- test/testtype.cpp | 2 +- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index 94eae0efd99..766397196ac 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -334,7 +334,7 @@ static void fillProgramMemoryFromConditions(ProgramMemory& pm, const Token* tok, fillProgramMemoryFromConditions(pm, tok->scope(), tok, settings); } -static void fillProgramMemoryFromAssignments(ProgramMemory& pm, const Token* tok, const ProgramMemory& state, const ProgramMemory::Map& vars) +static void fillProgramMemoryFromAssignments(ProgramMemory& pm, const Token* tok, const Settings* settings, const ProgramMemory& state, const ProgramMemory::Map& vars) { int indentlevel = 0; for (const Token *tok2 = tok; tok2; tok2 = tok2->previous()) { @@ -357,7 +357,7 @@ static void fillProgramMemoryFromAssignments(ProgramMemory& pm, const Token* tok } } } else if (tok2->exprId() > 0 && Token::Match(tok2, ".|(|[|*|%var%") && !pm.hasValue(tok2->exprId()) && - isVariableChanged(tok2, 0, nullptr, true)) { + isVariableChanged(tok2, 0, settings, true)) { pm.setUnknown(tok2); } @@ -403,13 +403,14 @@ static void removeModifiedVars(ProgramMemory& pm, const Token* tok, const Token* static ProgramMemory getInitialProgramState(const Token* tok, const Token* origin, + const Settings* settings, const ProgramMemory::Map& vars = ProgramMemory::Map {}) { ProgramMemory pm; if (origin) { fillProgramMemoryFromConditions(pm, origin, nullptr); const ProgramMemory state = pm; - fillProgramMemoryFromAssignments(pm, tok, state, vars); + fillProgramMemoryFromAssignments(pm, tok, settings, state, vars); removeModifiedVars(pm, tok, origin); } return pm; @@ -447,7 +448,7 @@ void ProgramMemoryState::addState(const Token* tok, const ProgramMemory::Map& va addVars(pm, vars); fillProgramMemoryFromConditions(pm, tok, settings); ProgramMemory local = pm; - fillProgramMemoryFromAssignments(pm, tok, local, vars); + fillProgramMemoryFromAssignments(pm, tok, settings, local, vars); addVars(pm, vars); replace(pm, tok); } @@ -501,13 +502,13 @@ ProgramMemory ProgramMemoryState::get(const Token* tok, const Token* ctx, const return local.state; } -ProgramMemory getProgramMemory(const Token *tok, const ProgramMemory::Map& vars) +ProgramMemory getProgramMemory(const Token *tok, const Settings* settings, const ProgramMemory::Map& vars) { ProgramMemory programMemory; for (const auto& p:vars) { const ValueFlow::Value &value = p.second; - programMemory.replace(getInitialProgramState(tok, value.tokvalue)); - programMemory.replace(getInitialProgramState(tok, value.condition)); + programMemory.replace(getInitialProgramState(tok, value.tokvalue, settings)); + programMemory.replace(getInitialProgramState(tok, value.condition, settings)); } fillProgramMemoryFromConditions(programMemory, tok, nullptr); ProgramMemory state; @@ -516,19 +517,19 @@ ProgramMemory getProgramMemory(const Token *tok, const ProgramMemory::Map& vars) programMemory.setValue(p.first.tok, value); } state = programMemory; - fillProgramMemoryFromAssignments(programMemory, tok, state, vars); + fillProgramMemoryFromAssignments(programMemory, tok, settings, state, vars); return programMemory; } ProgramMemory getProgramMemory(const Token* tok, const Token* expr, const ValueFlow::Value& value, const Settings* settings) { ProgramMemory programMemory; - programMemory.replace(getInitialProgramState(tok, value.tokvalue)); - programMemory.replace(getInitialProgramState(tok, value.condition)); + programMemory.replace(getInitialProgramState(tok, value.tokvalue, settings)); + programMemory.replace(getInitialProgramState(tok, value.condition, settings)); fillProgramMemoryFromConditions(programMemory, tok, settings); programMemory.setValue(expr, value); const ProgramMemory state = programMemory; - fillProgramMemoryFromAssignments(programMemory, tok, state, {{expr, value}}); + fillProgramMemoryFromAssignments(programMemory, tok, settings, state, {{expr, value}}); return programMemory; } diff --git a/test/testtype.cpp b/test/testtype.cpp index 5cf7d787bc7..613dca65643 100644 --- a/test/testtype.cpp +++ b/test/testtype.cpp @@ -70,7 +70,7 @@ class TestType : public TestFixture { // unsigned types getting promoted to int sizeof(int) = 4 bytes // and unsigned types having already a size of 4 bytes { - const std::string types[] = {"unsigned char", /*[unsigned]*/ "char", "bool", "unsigned short", "unsigned int", "unsigned long"}; + const std::string types[] = {"unsigned char", "bool", "unsigned short", "unsigned int", "unsigned long"}; for (const std::string& type : types) { check((type + " f(" + type +" x) { return x << 31; }").c_str(), &settings); ASSERT_EQUALS("", errout.str()); From 8b0599beb5973bdd5cce1cc38856799b37bfb98d Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 8 Mar 2023 14:03:24 +0100 Subject: [PATCH 2/2] Undo, clang-tidy --- lib/programmemory.cpp | 19 ------------------- test/testtype.cpp | 2 +- 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index 766397196ac..6876c1d8718 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -502,25 +502,6 @@ ProgramMemory ProgramMemoryState::get(const Token* tok, const Token* ctx, const return local.state; } -ProgramMemory getProgramMemory(const Token *tok, const Settings* settings, const ProgramMemory::Map& vars) -{ - ProgramMemory programMemory; - for (const auto& p:vars) { - const ValueFlow::Value &value = p.second; - programMemory.replace(getInitialProgramState(tok, value.tokvalue, settings)); - programMemory.replace(getInitialProgramState(tok, value.condition, settings)); - } - fillProgramMemoryFromConditions(programMemory, tok, nullptr); - ProgramMemory state; - for (const auto& p:vars) { - const ValueFlow::Value &value = p.second; - programMemory.setValue(p.first.tok, value); - } - state = programMemory; - fillProgramMemoryFromAssignments(programMemory, tok, settings, state, vars); - return programMemory; -} - ProgramMemory getProgramMemory(const Token* tok, const Token* expr, const ValueFlow::Value& value, const Settings* settings) { ProgramMemory programMemory; diff --git a/test/testtype.cpp b/test/testtype.cpp index 613dca65643..5cf7d787bc7 100644 --- a/test/testtype.cpp +++ b/test/testtype.cpp @@ -70,7 +70,7 @@ class TestType : public TestFixture { // unsigned types getting promoted to int sizeof(int) = 4 bytes // and unsigned types having already a size of 4 bytes { - const std::string types[] = {"unsigned char", "bool", "unsigned short", "unsigned int", "unsigned long"}; + const std::string types[] = {"unsigned char", /*[unsigned]*/ "char", "bool", "unsigned short", "unsigned int", "unsigned long"}; for (const std::string& type : types) { check((type + " f(" + type +" x) { return x << 31; }").c_str(), &settings); ASSERT_EQUALS("", errout.str());