From 1aff16041146c27c174fe0845109a418d278d74f Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 15 Mar 2022 14:32:33 +0100 Subject: [PATCH] Fix #9303 FP uninitvar after lambda expression (#3903) * Fix #9303 FP uninitvar after lambda expression * Format --- lib/checkuninitvar.cpp | 6 +++--- test/testuninitvar.cpp | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 2b2a5e1e0..704aa1bf2 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -365,7 +365,7 @@ static bool isVariableUsed(const Token *tok, const Variable& var) bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var, bool * const possibleInit, bool * const noreturn, Alloc* const alloc, const std::string &membervar, std::map variableValue) { - const bool suppressErrors(possibleInit && *possibleInit); // Assume that this is a variable delaratkon, rather than a fundef + const bool suppressErrors(possibleInit && *possibleInit); // Assume that this is a variable declaration, rather than a fundef const bool printDebug = mSettings->debugwarnings; if (possibleInit) @@ -392,8 +392,8 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var break; } - // Unconditional inner scope or try.. - if (tok->str() == "{" && Token::Match(tok->previous(), ",|;|{|}|try")) { + // Unconditional inner scope, try, lambda, init list + if (tok->str() == "{" && Token::Match(tok->previous(), ",|;|{|}|]|try")) { bool possibleInitInner = false; if (checkScopeForVariable(tok->next(), var, &possibleInitInner, noreturn, alloc, membervar, variableValue)) return true; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 68a2acec2..582821df5 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -3079,6 +3079,35 @@ private: " } catch(...) {}\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: i\n", errout.str()); + + checkUninitVar("void f(bool x) {\n" + " bool b;\n" + " {\n" + " auto g = []{};\n" + " b = x;\n" + " }\n" + " if (b) {}\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + + checkUninitVar("void f(bool x) {\n" + " bool b;\n" + " {\n" + " int i[2]{ 1, 2 };\n" + " b = x;\n" + " }\n" + " if (b) {}\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + + checkUninitVar("void f(bool x) {\n" + " bool b;\n" + " {\n" + " auto g = []{};\n" + " }\n" + " if (b) {}\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:6]: (error) Uninitialized variable: b\n", errout.str()); } void uninitvar_funcptr() {