From 61b7983e7c52029c16c9a8f8679fbf6e39ae30c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 10 Jun 2023 15:52:27 +0200 Subject: [PATCH 1/2] Fix FP uninitStructMember when other variable is only nonzero if struct member is initialized --- lib/checkuninitvar.cpp | 12 +++++++++--- test/testuninitvar.cpp | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 4ed0a6d7e26..f7914a6c4c1 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -418,9 +418,15 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var continue; } - // assignment with nonzero constant.. - if (Token::Match(tok->previous(), "[;{}] %var% = - %name% ;")) - variableValue[tok->varId()] = !VariableValue(0); + // track values of other variables.. + if (Token::Match(tok->previous(), "[;{}] %var% =")) { + if (tok->next()->astOperand2()->hasKnownIntValue()) + variableValue[tok->varId()] = VariableValue(tok->next()->astOperand2()->getKnownIntValue()); + else if (Token::Match(tok->previous(), "[;{}] %var% = - %name% ;")) + variableValue[tok->varId()] = !VariableValue(0); + else + variableValue.erase(tok->varId()); + } // Inner scope.. else if (Token::simpleMatch(tok, "if (")) { diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 6ce2ce41c11..49f77695ce1 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -4743,6 +4743,20 @@ class TestUninitVar : public TestFixture { " char* q = (s).p;\n" "}\n"); ASSERT_EQUALS("", errout.str()); + + // if with flag + checkUninitVar("struct AB { int a; int b; };\n" + "int f(int x) {\n" + " struct AB ab;\n" + " int flag = 0;\n" + " if (x == 0) {\n" + " flag = dostuff(&ab);\n" + " }\n" + " if (flag) {\n" + " a = ab.a;\n" + " }\n" + "}"); + ASSERT_EQUALS("", errout.str()); } void uninitvar2_while() { From 2d82b887a6b26846749d9b45899b107d0f0108b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 10 Jun 2023 19:29:55 +0200 Subject: [PATCH 2/2] fix --- lib/checkuninitvar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index f7914a6c4c1..e4e348fbf3b 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -420,7 +420,7 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var // track values of other variables.. if (Token::Match(tok->previous(), "[;{}] %var% =")) { - if (tok->next()->astOperand2()->hasKnownIntValue()) + if (tok->next()->astOperand2() && tok->next()->astOperand2()->hasKnownIntValue()) variableValue[tok->varId()] = VariableValue(tok->next()->astOperand2()->getKnownIntValue()); else if (Token::Match(tok->previous(), "[;{}] %var% = - %name% ;")) variableValue[tok->varId()] = !VariableValue(0);