FwdAnalysis: Tweak possiblyAliased
This commit is contained in:
parent
9dd00a8066
commit
1bfe98447a
|
@ -1296,14 +1296,20 @@ bool FwdAnalysis::possiblyAliased(const Token *expr, const Token *startToken) co
|
||||||
const bool followVar = false;
|
const bool followVar = false;
|
||||||
for (const Token *tok = startToken; tok; tok = tok->previous()) {
|
for (const Token *tok = startToken; tok; tok = tok->previous()) {
|
||||||
if (tok->str() == "{" && tok->scope()->type == Scope::eFunction)
|
if (tok->str() == "{" && tok->scope()->type == Scope::eFunction)
|
||||||
|
break;
|
||||||
|
|
||||||
|
const Token *addrOf = nullptr;
|
||||||
|
if (Token::Match(tok, "& %name% ="))
|
||||||
|
addrOf = tok->tokAt(2)->astOperand2();
|
||||||
|
else if (tok->isUnaryOp("&"))
|
||||||
|
addrOf = tok->astOperand1();
|
||||||
|
else if (Token::simpleMatch(tok, "std :: ref ("))
|
||||||
|
addrOf = tok->tokAt(3)->astOperand2();
|
||||||
|
else
|
||||||
continue;
|
continue;
|
||||||
if (isSameExpression(mCpp, macro, expr, tok, mLibrary, pure, followVar)) {
|
|
||||||
const Token *parent = tok->astParent();
|
for (const Token *subexpr = expr; subexpr; subexpr = subexpr->astOperand1()) {
|
||||||
if (parent && parent->isUnaryOp("&"))
|
if (isSameExpression(mCpp, macro, subexpr, addrOf, mLibrary, pure, followVar))
|
||||||
return true;
|
|
||||||
if (parent && Token::Match(parent->tokAt(-2), "& %name% ="))
|
|
||||||
return true;
|
|
||||||
if (parent && Token::simpleMatch(parent->tokAt(-3), "std :: ref ("))
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,6 +150,7 @@ private:
|
||||||
TEST_CASE(localvarStruct3);
|
TEST_CASE(localvarStruct3);
|
||||||
TEST_CASE(localvarStruct5);
|
TEST_CASE(localvarStruct5);
|
||||||
TEST_CASE(localvarStruct6);
|
TEST_CASE(localvarStruct6);
|
||||||
|
TEST_CASE(localvarStruct7);
|
||||||
TEST_CASE(localvarStructArray);
|
TEST_CASE(localvarStructArray);
|
||||||
|
|
||||||
TEST_CASE(localvarOp); // Usage with arithmetic operators
|
TEST_CASE(localvarOp); // Usage with arithmetic operators
|
||||||
|
@ -3279,6 +3280,46 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void localvarStruct7() {
|
||||||
|
functionVariableUsage("struct IMAPARG {\n"
|
||||||
|
" void *text;\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"void fun() {\n"
|
||||||
|
" IMAPARG *args, aatt;\n"
|
||||||
|
" args = &aatt;\n"
|
||||||
|
" aatt.text = tmp;\n"
|
||||||
|
" dostuff(args);\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
functionVariableUsage("struct ARG {\n"
|
||||||
|
" void *a;\n"
|
||||||
|
" void *b;\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"void fun() {\n"
|
||||||
|
" ARG aatt;\n"
|
||||||
|
" int *p = &aatt.b;\n"
|
||||||
|
" aatt.a = 123;\n"
|
||||||
|
" dostuff(p);\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("[test.cpp:9]: (style) Variable 'aatt.a' is assigned a value that is never used.\n", errout.str());
|
||||||
|
|
||||||
|
functionVariableUsage("struct AB {\n"
|
||||||
|
" int a;\n"
|
||||||
|
" int b;\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"void fun() {\n"
|
||||||
|
" AB ab;\n"
|
||||||
|
" int &a = ab.a;\n"
|
||||||
|
" ab.a = 123;\n"
|
||||||
|
" dostuff(a);\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
void localvarStructArray() {
|
void localvarStructArray() {
|
||||||
// #3633 - detect that struct array is assigned a value
|
// #3633 - detect that struct array is assigned a value
|
||||||
functionVariableUsage("void f() {\n"
|
functionVariableUsage("void f() {\n"
|
||||||
|
|
Loading…
Reference in New Issue