Uninitialized struct members: Improved checking when struct member is used in expression
This commit is contained in:
parent
8647e4c0d0
commit
3cf0e88fbe
|
@ -1321,7 +1321,7 @@ bool CheckUninitVar::checkScopeForVariable(const Scope* scope, const Token *tok,
|
|||
|
||||
while (tok && tok->str() != ";") {
|
||||
// variable is seen..
|
||||
if (tok->varId() == var.varId()) {
|
||||
if (tok->varId() == var.varId() && (membervar == NULL)) {
|
||||
// Use variable
|
||||
if (!suppressErrors && isVariableUsage(scope, tok, var.isPointer()))
|
||||
uninitvarError(tok, tok->str());
|
||||
|
@ -1343,8 +1343,14 @@ bool CheckUninitVar::checkScopeForVariable(const Scope* scope, const Token *tok,
|
|||
// variable is seen..
|
||||
if (tok->varId() == var.varId()) {
|
||||
if (membervar) {
|
||||
if (Token::Match(tok, "%var% . %var% [=.[]") && tok->strAt(2) == membervar->name())
|
||||
return true;
|
||||
if (Token::Match(tok, "%var% . %var%") && tok->strAt(2) == membervar->name()) {
|
||||
if (Token::Match(tok->tokAt(3), "[=.[]"))
|
||||
return true;
|
||||
else if (Token::Match(tok->previous(), "%op%") || Token::Match(tok->previous(), "[|="))
|
||||
uninitStructMemberError(tok, tok->str() + "." + membervar->name());
|
||||
else
|
||||
return true;
|
||||
}
|
||||
else if (tok->strAt(1) == "=")
|
||||
return true;
|
||||
else if (tok->strAt(-1) == "&")
|
||||
|
|
|
@ -2564,6 +2564,20 @@ private:
|
|||
"}\n", "test.c", true);
|
||||
ASSERT_EQUALS("[test.c:6]: (error) Uninitialized struct member: ab.b\n", errout.str());
|
||||
|
||||
checkUninitVar2("struct AB { int a; int b; };\n"
|
||||
"void f(void) {\n"
|
||||
" struct AB ab;\n"
|
||||
" int a = ab.a;\n"
|
||||
"}\n", "test.c", true);
|
||||
ASSERT_EQUALS("[test.c:4]: (error) Uninitialized struct member: ab.a\n", errout.str());
|
||||
|
||||
checkUninitVar2("struct AB { int a; int b; };\n"
|
||||
"void f(void) {\n"
|
||||
" struct AB ab;\n"
|
||||
" buf[ab.a] = 0;\n"
|
||||
"}\n", "test.c", true);
|
||||
ASSERT_EQUALS("[test.c:4]: (error) Uninitialized struct member: ab.a\n", errout.str());
|
||||
|
||||
checkUninitVar2("struct AB { int a; int b; };\n"
|
||||
"void do_something(const struct AB ab);\n"
|
||||
"void f(void) {\n"
|
||||
|
@ -2607,6 +2621,23 @@ private:
|
|||
"}\n", "test.c", true);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// return
|
||||
checkUninitVar2("struct AB { int a; int b; };\n"
|
||||
"void f(void) {\n"
|
||||
" struct AB ab;\n"
|
||||
" ab.a = 0;\n"
|
||||
" return ab.b;\n"
|
||||
"}\n", "test.c", true);
|
||||
TODO_ASSERT_EQUALS("error", "", errout.str());
|
||||
|
||||
checkUninitVar2("struct AB { int a; int b; };\n"
|
||||
"void f(void) {\n"
|
||||
" struct AB ab;\n"
|
||||
" ab.a = 0;\n"
|
||||
" return ab.a;\n"
|
||||
"}\n", "test.c", true);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// checkIfForWhileHead
|
||||
checkUninitVar2("struct FRED {\n"
|
||||
" int a;\n"
|
||||
|
|
Loading…
Reference in New Issue