From 56fcfc6f4166e70523a0af9d8febc1f418d541c5 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 26 Mar 2025 16:34:38 -0500 Subject: [PATCH 1/2] Fix 13114: FN: danglingTempReference (Accessing Temporary Object Through Method Returning Self) --- lib/valueflow.cpp | 4 +--- test/testautovariables.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 54a927bab1f..ee4264e958d 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -1712,10 +1712,8 @@ static std::vector getLifetimeTokens(const Token* tok, for (ValueFlow::LifetimeToken& lt : getLifetimeTokens(returnTok, escape, errorPath, pred, settings, depth - returns.size())) { const Token* argvarTok = lt.token; const Variable* argvar = argvarTok->variable(); - if (!argvar) - continue; const Token* argTok = nullptr; - if (argvar->isArgument() && (argvar->isReference() || argvar->isRValueReference())) { + if (argvar && argvar->isArgument() && (argvar->isReference() || argvar->isRValueReference())) { const int n = getArgumentPos(argvar, f); if (n < 0) return std::vector {}; diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 32fa439e4b5..724d1c24fcb 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -4356,6 +4356,31 @@ class TestAutoVariables : public TestFixture { " *p = ret;\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("struct A {\n" + " int val=42;\n" + " const A& Get() const & {\n" + " return *this;\n" + " }\n" + "};\n" + "const A *ptr;\n" + "int main() {\n" + " ptr = &A().Get();\n" + " return ptr->val;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:9] -> [test.cpp:9] -> [test.cpp:9] -> [test.cpp:10]: (error) Using pointer that is a temporary.\n", errout_str()); + + check("struct A {\n" + " int val = 42;\n" + " const A& Get() const {\n" + " return *this;\n" + " }\n" + "};\n" + "int main() {\n" + " const A& r = A().Get();\n" + " return r.val;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:4] -> [test.cpp:8] -> [test.cpp:9]: (error) Using reference to dangling temporary.\n", errout_str()); } void invalidLifetime() { From d64443b0aba8ed4db4f223c54be71a062554ebfd Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 26 Mar 2025 16:35:16 -0500 Subject: [PATCH 2/2] Format --- test/testautovariables.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 724d1c24fcb..3fd722ebbe1 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -4368,7 +4368,9 @@ class TestAutoVariables : public TestFixture { " ptr = &A().Get();\n" " return ptr->val;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:9] -> [test.cpp:9] -> [test.cpp:9] -> [test.cpp:10]: (error) Using pointer that is a temporary.\n", errout_str()); + ASSERT_EQUALS( + "[test.cpp:4] -> [test.cpp:9] -> [test.cpp:9] -> [test.cpp:9] -> [test.cpp:10]: (error) Using pointer that is a temporary.\n", + errout_str()); check("struct A {\n" " int val = 42;\n" @@ -4380,7 +4382,9 @@ class TestAutoVariables : public TestFixture { " const A& r = A().Get();\n" " return r.val;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:4] -> [test.cpp:8] -> [test.cpp:9]: (error) Using reference to dangling temporary.\n", errout_str()); + ASSERT_EQUALS( + "[test.cpp:8] -> [test.cpp:4] -> [test.cpp:8] -> [test.cpp:9]: (error) Using reference to dangling temporary.\n", + errout_str()); } void invalidLifetime() {