Skip to content

Commit 7d7584b

Browse files
authored
Fix 10575: Improve check; lifetime, struct member points to local data (#3541)
1 parent be14866 commit 7d7584b

2 files changed

Lines changed: 32 additions & 4 deletions

File tree

lib/checkautovariables.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -496,13 +496,22 @@ static bool isDanglingSubFunction(const Token* tokvalue, const Token* tok)
496496
return exprDependsOnThis(parent);
497497
}
498498

499+
static const Variable* getParentVar(const Token* tok)
500+
{
501+
if (!tok)
502+
return nullptr;
503+
if (Token::simpleMatch(tok, "."))
504+
return getParentVar(tok->astOperand1());
505+
return tok->variable();
506+
}
507+
499508
static bool isAssignedToNonLocal(const Token* tok)
500509
{
501510
if (!Token::simpleMatch(tok->astParent(), "="))
502511
return false;
503-
if (!Token::Match(tok->astParent()->astOperand1(), "%var%"))
512+
if (!astIsRHS(tok))
504513
return false;
505-
const Variable* var = tok->astParent()->astOperand1()->variable();
514+
const Variable* var = getParentVar(tok->astParent()->astOperand1());
506515
if (!var)
507516
return false;
508517
return !var->isLocal() || var->isStatic();
@@ -597,8 +606,8 @@ void CheckAutoVariables::checkVarLifetimeScope(const Token * start, const Token
597606
const Variable * var = nullptr;
598607
const Token * tok2 = tok;
599608
if (Token::simpleMatch(tok->astParent(), "=")) {
600-
if (tok->astParent()->astOperand2() == tok) {
601-
var = getLHSVariable(tok->astParent());
609+
if (astIsRHS(tok)) {
610+
var = getParentVar(tok->astParent()->astOperand1());
602611
tok2 = tok->astParent()->astOperand1();
603612
}
604613
} else if (tok->variable() && tok->variable()->declarationId() == tok->varId()) {

test/testautovariables.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2833,6 +2833,25 @@ class TestAutoVariables : public TestFixture {
28332833
" auto getMore() -> int & { return get(); }\n"
28342834
"};\n");
28352835
ASSERT_EQUALS("", errout.str());
2836+
2837+
// #10575
2838+
check("struct Data {\n"
2839+
" int x=0;\n"
2840+
" int y=0;\n"
2841+
"};\n"
2842+
"struct MoreData {\n"
2843+
" Data *data1;\n"
2844+
"};\n"
2845+
"struct Fred {\n"
2846+
" Fred() {\n"
2847+
" Data data;\n"
2848+
" mMoreData.data1 = &data;\n"
2849+
" }\n"
2850+
" MoreData mMoreData;\n"
2851+
"};\n");
2852+
ASSERT_EQUALS(
2853+
"[test.cpp:11] -> [test.cpp:10] -> [test.cpp:11]: (error) Non-local variable 'mMoreData.data1' will use pointer to local variable 'data'.\n",
2854+
errout.str());
28362855
}
28372856

28382857
void danglingLifetimeFunction() {

0 commit comments

Comments
 (0)