From 9711064b74cb354cd9aa4a1735ab60882e450e5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Thu, 4 Aug 2016 14:39:54 +0200 Subject: [PATCH] Fixed #6646 (False positive uninitvar - loopvariable initialized inside loop) --- lib/checkuninitvar.cpp | 4 ++++ test/testuninitvar.cpp | 13 +++++++++++++ 2 files changed, 17 insertions(+) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 84cbcaace..0c9830b81 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -101,6 +101,10 @@ void CheckUninitVar::checkScope(const Scope* scope) if (!tok) continue; + if (tok->astParent() && Token::simpleMatch(tok->astParent()->previous(), "for (") && + checkLoopBody(tok->astParent()->link()->next(), *i, i->isArray() ? ARRAY : NO_ALLOC, "", true)) + continue; + if (i->isArray()) { Alloc alloc = ARRAY; checkScopeForVariable(tok, *i, nullptr, nullptr, &alloc, ""); diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index bef51147a..265227385 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -3541,6 +3541,19 @@ private: " }\n" "}"); ASSERT_EQUALS("", errout.str()); + + // #6646 - init in for loop + checkUninitVar("void f() {\n" // No FP + " for (int i;;i++)\n" + " dostuff(&i);\n" + "}"); + ASSERT_EQUALS("", errout.str()); + + checkUninitVar("void f() {\n" // No FN + " for (int i;;i++)\n" + " a=i;\n" + "}"); + ASSERT_EQUALS("[test.cpp:2]: (error) Uninitialized variable: i\n", errout.str()); } void uninitvar2_4494() {