diff --git a/lib/vf_analyzers.cpp b/lib/vf_analyzers.cpp index cfba7d5f970..5e73245257c 100644 --- a/lib/vf_analyzers.cpp +++ b/lib/vf_analyzers.cpp @@ -892,7 +892,7 @@ static bool isAliasOf(const Variable * var, const Token *tok, nonneg int varid, return false; if (val.isLifetimeValue() && !val.isLocalLifetimeValue()) return false; - if (val.isLifetimeValue() && val.lifetimeKind != ValueFlow::Value::LifetimeKind::Address) + if (val.isLifetimeValue() && val.lifetimeKind != ValueFlow::Value::LifetimeKind::Address && val.lifetimeKind != ValueFlow::Value::LifetimeKind::SubObject) return false; if (!Token::Match(val.tokvalue, ".|&|*|%var%")) return false; @@ -1167,7 +1167,7 @@ struct SingleValueFlowAnalyzer : ValueFlowAnalyzer { } bool isAlias(const Token* tok, bool& inconclusive) const override { - if (value.isLifetimeValue()) + if (value.isLifetimeValue() && value.lifetimeKind != ValueFlow::Value::LifetimeKind::SubObject) return false; for (const auto& m: { std::ref(getVars()), std::ref(getAliasedVars()) diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 7774d7fa733..d2189de26ca 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -3240,6 +3240,15 @@ class TestAutoVariables : public TestFixture { " return s[0].p.get();\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + check("std::unique_ptr g_p;\n" // #14958 + "int* f() {\n" + " std::unique_ptr tmp = std::make_unique();\n" + " int* p = tmp.get();\n" + " g_p = std::move(tmp);\n" + " return p;\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void danglingLifetime() { check("auto f() {\n"