Fixed #4569 (False Positive: Uninitialised variable)
This commit is contained in:
parent
94f1d34dcb
commit
442db6cdf9
|
@ -1322,7 +1322,7 @@ bool CheckUninitVar::checkScopeForVariable(const Scope* scope, const Token *tok,
|
||||||
|
|
||||||
if (tok2 && tok2->str() == "{") {
|
if (tok2 && tok2->str() == "{") {
|
||||||
bool possibleinit = false;
|
bool possibleinit = false;
|
||||||
bool init = checkLoopBody(tok2, var, membervar);
|
bool init = checkLoopBody(tok2, var, membervar, suppressErrors);
|
||||||
|
|
||||||
// variable is initialized in the loop..
|
// variable is initialized in the loop..
|
||||||
if (possibleinit || init)
|
if (possibleinit || init)
|
||||||
|
@ -1435,7 +1435,7 @@ bool CheckUninitVar::checkIfForWhileHead(const Token *startparentheses, const Va
|
||||||
return false;
|
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;
|
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())
|
if (membervar.empty())
|
||||||
uninitvarError(usetok, usetok->str());
|
uninitvarError(usetok, usetok->str());
|
||||||
else
|
else
|
||||||
|
|
|
@ -66,7 +66,7 @@ public:
|
||||||
void checkScope(const Scope* scope);
|
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 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 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);
|
static bool isVariableUsage(const Token *vartok, bool ispointer, bool cpp);
|
||||||
bool isMemberVariableAssignment(const Token *tok, const std::string &membervar) const;
|
bool isMemberVariableAssignment(const Token *tok, const std::string &membervar) const;
|
||||||
bool isMemberVariableUsage(const Token *tok, bool isPointer, const std::string &membervar) const;
|
bool isMemberVariableUsage(const Token *tok, bool isPointer, const std::string &membervar) const;
|
||||||
|
|
|
@ -2758,6 +2758,16 @@ private:
|
||||||
"}\n", "test.c");
|
"}\n", "test.c");
|
||||||
ASSERT_EQUALS("[test.c:5]: (error) Uninitialized variable: ab\n"
|
ASSERT_EQUALS("[test.c:5]: (error) Uninitialized variable: ab\n"
|
||||||
"[test.c:5]: (error) Uninitialized struct member: ab.a\n", errout.str());
|
"[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() {
|
void uninitvar2_4494() {
|
||||||
|
|
Loading…
Reference in New Issue