Bug hunting; Improved uninit checking for function calls with constant parameter

This commit is contained in:
Daniel Marjamäki 2020-06-27 14:15:53 +02:00
parent d303510c78
commit e19ef6ac62
2 changed files with 16 additions and 4 deletions

View File

@ -173,8 +173,17 @@ static void uninit(const Token *tok, const ExprEngine::Value &value, ExprEngine:
} }
} }
if (!value.isUninit() && uninitStructMember.empty()) bool uninitData = false;
return; if (!value.isUninit() && uninitStructMember.empty()) {
if (Token::Match(tok->astParent(), "[(,]")) {
if (const auto* arrayValue = dynamic_cast<const ExprEngine::ArrayValue*>(&value)) {
uninitData = arrayValue->data.size() >= 1 && arrayValue->data[0].value->isUninit();
}
}
if (!uninitData)
return;
}
// lhs in assignment // lhs in assignment
if (tok->astParent()->str() == "=" && tok == tok->astParent()->astOperand1()) if (tok->astParent()->str() == "=" && tok == tok->astParent()->astOperand1())
@ -239,8 +248,11 @@ static void uninit(const Token *tok, const ExprEngine::Value &value, ExprEngine:
const Variable *argvar = parent->astOperand1()->function()->getArgumentVar(count); const Variable *argvar = parent->astOperand1()->function()->getArgumentVar(count);
if (argvar && argvar->isReference() && !argvar->isConst()) if (argvar && argvar->isReference() && !argvar->isConst())
return; return;
if (uninitData && argvar && !argvar->isConst())
return;
} }
} } else if (uninitData)
return;
} }
// Avoid FP for array declaration // Avoid FP for array declaration

View File

@ -69,7 +69,7 @@ private:
check("char foo(const char id[]);\n" check("char foo(const char id[]);\n"
"void bar() { char data[10]; foo(data); }"); "void bar() { char data[10]; foo(data); }");
TODO_ASSERT_EQUALS("error", "", errout.str()); ASSERT_EQUALS("[test.cpp:2]: (error) Cannot determine that 'data' is initialized\n", errout.str());
check("char foo(char id[]);\n" check("char foo(char id[]);\n"
"void bar() { char data[10]; foo(data); }"); "void bar() { char data[10]; foo(data); }");