Skip to content

Commit 2684ba9

Browse files
authored
Fix 13114: FN: danglingTempReference (Accessing Temporary Object Through Method Returning Self) (#7409)
1 parent b153ceb commit 2684ba9

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

lib/valueflow.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1712,10 +1712,8 @@ static std::vector<ValueFlow::LifetimeToken> getLifetimeTokens(const Token* tok,
17121712
for (ValueFlow::LifetimeToken& lt : getLifetimeTokens(returnTok, escape, errorPath, pred, settings, depth - returns.size())) {
17131713
const Token* argvarTok = lt.token;
17141714
const Variable* argvar = argvarTok->variable();
1715-
if (!argvar)
1716-
continue;
17171715
const Token* argTok = nullptr;
1718-
if (argvar->isArgument() && (argvar->isReference() || argvar->isRValueReference())) {
1716+
if (argvar && argvar->isArgument() && (argvar->isReference() || argvar->isRValueReference())) {
17191717
const int n = getArgumentPos(argvar, f);
17201718
if (n < 0)
17211719
return std::vector<ValueFlow::LifetimeToken> {};

test/testautovariables.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4356,6 +4356,35 @@ class TestAutoVariables : public TestFixture {
43564356
" *p = ret;\n"
43574357
"}\n");
43584358
ASSERT_EQUALS("", errout_str());
4359+
4360+
check("struct A {\n"
4361+
" int val=42;\n"
4362+
" const A& Get() const & {\n"
4363+
" return *this;\n"
4364+
" }\n"
4365+
"};\n"
4366+
"const A *ptr;\n"
4367+
"int main() {\n"
4368+
" ptr = &A().Get();\n"
4369+
" return ptr->val;\n"
4370+
"}\n");
4371+
ASSERT_EQUALS(
4372+
"[test.cpp:4] -> [test.cpp:9] -> [test.cpp:9] -> [test.cpp:9] -> [test.cpp:10]: (error) Using pointer that is a temporary.\n",
4373+
errout_str());
4374+
4375+
check("struct A {\n"
4376+
" int val = 42;\n"
4377+
" const A& Get() const {\n"
4378+
" return *this;\n"
4379+
" }\n"
4380+
"};\n"
4381+
"int main() {\n"
4382+
" const A& r = A().Get();\n"
4383+
" return r.val;\n"
4384+
"}\n");
4385+
ASSERT_EQUALS(
4386+
"[test.cpp:8] -> [test.cpp:4] -> [test.cpp:8] -> [test.cpp:9]: (error) Using reference to dangling temporary.\n",
4387+
errout_str());
43594388
}
43604389

43614390
void invalidLifetime() {

0 commit comments

Comments
 (0)