Fix 10553: FP uninitvar with strcpy (#3652)

This commit is contained in:
Paul Fultz II 2021-12-23 01:22:41 -06:00 committed by GitHub
parent e6ccf299b9
commit d36aa590cd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 1 deletions

View File

@ -2017,6 +2017,17 @@ static bool isTrivialConstructor(const Token* tok)
return false; return false;
} }
static bool isArray(const Token* tok)
{
if (!tok)
return false;
if (tok->variable())
return tok->variable()->isArray();
if (Token::simpleMatch(tok, "."))
return isArray(tok->astOperand2());
return false;
}
bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Settings *settings, bool *inconclusive) bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Settings *settings, bool *inconclusive)
{ {
if (!tok) if (!tok)
@ -2056,7 +2067,7 @@ bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Setti
argDirection == Library::ArgumentChecks::Direction::DIR_INOUT) { argDirection == Library::ArgumentChecks::Direction::DIR_INOUT) {
// With out or inout the direction of the content is specified, not a pointer itself, so ignore pointers for now // With out or inout the direction of the content is specified, not a pointer itself, so ignore pointers for now
const ValueType * const valueType = tok1->valueType(); const ValueType * const valueType = tok1->valueType();
if (valueType && valueType->pointer == indirect) { if ((valueType && valueType->pointer == indirect) || (indirect == 0 && isArray(tok1))) {
return true; return true;
} }
} }

View File

@ -5129,6 +5129,17 @@ private:
" return rez;\n" " return rez;\n"
"}\n"); "}\n");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
// #10553
valueFlowUninit("struct CharDataOnly {\n"
" char data[100];\n"
"};\n"
"CharDataOnly f() {\n"
" CharDataOnly testData;\n"
" strcpy(testData.data, \"string smaller than size\");\n"
" return testData;\n"
"}\n");
ASSERT_EQUALS("", errout.str());
} }
void valueFlowUninitBreak() { // Do not show duplicate warnings about the same uninitialized value void valueFlowUninitBreak() { // Do not show duplicate warnings about the same uninitialized value