diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 2bfcf7756..1001e8f71 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1322,7 +1322,7 @@ bool CheckUninitVar::checkScopeForVariable(const Scope* scope, const Token *tok, if (tok2 && tok2->str() == "{") { bool possibleinit = false; - bool init = checkLoopBody(tok2, var, membervar); + bool init = checkLoopBody(tok2, var, membervar, suppressErrors); // variable is initialized in the loop.. if (possibleinit || init) @@ -1435,7 +1435,7 @@ bool CheckUninitVar::checkIfForWhileHead(const Token *startparentheses, const Va return false; } -bool CheckUninitVar::checkLoopBody(const Token *tok, const Variable& var, const std::string &membervar) +bool CheckUninitVar::checkLoopBody(const Token *tok, const Variable& var, const std::string &membervar, const bool suppressErrors) { const Token *usetok = NULL; @@ -1458,7 +1458,7 @@ bool CheckUninitVar::checkLoopBody(const Token *tok, const Variable& var, const } } - if (usetok) { + if (!suppressErrors && usetok) { if (membervar.empty()) uninitvarError(usetok, usetok->str()); else diff --git a/lib/checkuninitvar.h b/lib/checkuninitvar.h index 7e0646b81..9dd913bb8 100644 --- a/lib/checkuninitvar.h +++ b/lib/checkuninitvar.h @@ -66,7 +66,7 @@ public: void checkScope(const Scope* scope); bool checkScopeForVariable(const Scope* scope, const Token *tok, const Variable& var, bool * const possibleInit, bool * const noreturn, const std::string &membervar); bool checkIfForWhileHead(const Token *startparentheses, const Variable& var, bool suppressErrors, bool isuninit, const std::string &membervar); - bool checkLoopBody(const Token *tok, const Variable& var, const std::string &membervar); + bool checkLoopBody(const Token *tok, const Variable& var, const std::string &membervar, const bool suppressErrors); static bool isVariableUsage(const Token *vartok, bool ispointer, bool cpp); bool isMemberVariableAssignment(const Token *tok, const std::string &membervar) const; bool isMemberVariableUsage(const Token *tok, bool isPointer, const std::string &membervar) const; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 7ad683cbe..fa889d947 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -2758,6 +2758,16 @@ private: "}\n", "test.c"); ASSERT_EQUALS("[test.c:5]: (error) Uninitialized variable: ab\n" "[test.c:5]: (error) Uninitialized struct member: ab.a\n", errout.str()); + + checkUninitVar2("void f(int i) {\n" // #4569 fp + " float *buffer;\n" + " if(i>10) buffer = f;\n" + " if(i>10) {\n" + " for (int i=0;i<10;i++)\n" + " buffer[i] = 0;\n" // <- fp + " }\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void uninitvar2_4494() {