Fixed #6766 (Improve check; struct member is assigned value that is never used)
This commit is contained in:
parent
3b37c14b3c
commit
2e2d766e2b
|
@ -2680,6 +2680,26 @@ struct FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const
|
|||
if (mWhat == What::Reassign)
|
||||
return Result(Result::Type::BAILOUT, parent->astParent());
|
||||
continue;
|
||||
} else if (mWhat == What::UnusedValue && Token::simpleMatch(parent, "&") && Token::Match(parent->astParent(), "[,(]")) {
|
||||
// Pass variable to function the writes it
|
||||
const Token *ftok = parent->astParent();
|
||||
while (Token::simpleMatch(ftok, ","))
|
||||
ftok = ftok->astParent();
|
||||
if (ftok && Token::Match(ftok->previous(), "%name% (")) {
|
||||
const std::vector<const Token *> args = getArguments(ftok);
|
||||
int argnr = 0;
|
||||
while (argnr < args.size() && args[argnr] != parent)
|
||||
argnr++;
|
||||
if (argnr < args.size()) {
|
||||
const Library::Function* functionInfo = mLibrary.getFunction(ftok->astOperand1());
|
||||
if (functionInfo) {
|
||||
const auto it = functionInfo->argumentChecks.find(argnr + 1);
|
||||
if (it != functionInfo->argumentChecks.end() && it->second.direction == Library::ArgumentChecks::Direction::DIR_OUT)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
return Result(Result::Type::BAILOUT, parent->astParent());
|
||||
} else {
|
||||
// TODO: this is a quick bailout
|
||||
return Result(Result::Type::BAILOUT, parent->astParent());
|
||||
|
|
|
@ -172,6 +172,7 @@ private:
|
|||
TEST_CASE(localvarStruct7);
|
||||
TEST_CASE(localvarStruct8);
|
||||
TEST_CASE(localvarStruct9);
|
||||
TEST_CASE(localvarStruct10);
|
||||
TEST_CASE(localvarStructArray);
|
||||
TEST_CASE(localvarUnion1);
|
||||
|
||||
|
@ -4529,6 +4530,17 @@ private:
|
|||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void localvarStruct10() { // #6766
|
||||
functionVariableUsage("struct S { int x; };\n"
|
||||
"\n"
|
||||
"void foo() {\n"
|
||||
" struct S s;\n"
|
||||
" s.x = 3;\n"
|
||||
" memcpy (&s, &s2, sizeof (S));\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:5]: (style) Variable 's.x' is assigned a value that is never used.\n", errout.str());
|
||||
}
|
||||
|
||||
void localvarStructArray() {
|
||||
// #3633 - detect that struct array is assigned a value
|
||||
functionVariableUsage("void f() {\n"
|
||||
|
|
Loading…
Reference in New Issue