Skip to content

Commit

Permalink
Fix #11546 FP danglingTemporaryLifetime with unknown member
Browse files Browse the repository at this point in the history
  • Loading branch information
chrchr-github committed Jul 20, 2023
1 parent d2546d5 commit e9f369d
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 10 deletions.
24 changes: 14 additions & 10 deletions lib/valueflow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4259,26 +4259,30 @@ struct LifetimeStore {
}
};

static bool isOwningVariables(const std::list<Variable>& vars, int depth = 10)
static bool isOwningVariables(const std::list<Variable>& vars, const std::vector<const Token*>& args, int depth = 10)
{
if (depth < 0)
return false;
return vars.empty() || std::all_of(vars.cbegin(), vars.cend(), [&](const Variable& var) {
if (var.isReference() || var.isPointer())
return false;
return std::any_of(vars.cbegin(), vars.cend(), [&](const Variable& var) {
const ValueType* vt = var.valueType();
if (vt) {
if (vt->pointer > 0)
if (std::none_of(args.begin(), args.end(), [vt](const Token* arg) {
return arg->valueType() && arg->valueType()->type == vt->type;
}))
return false;
if (vt->isPrimitive())
if (vt->pointer > 0)
return true;
if (vt->isEnum())
if (vt->reference != Reference::None)
return true;
if (vt->isPrimitive())
return false;
if (vt->isEnum())
return false;
// TODO: Check container inner type
if (vt->type == ValueType::CONTAINER && vt->container)
return !vt->container->view;
return vt->container->view;
if (vt->typeScope)
return isOwningVariables(vt->typeScope->varlist, depth - 1);
return isOwningVariables(vt->typeScope->varlist, args, depth - 1);
}
return false;
});
Expand Down Expand Up @@ -4357,7 +4361,7 @@ static void valueFlowLifetimeUserConstructor(Token* tok,
else
ls.byVal(tok, tokenlist, errorLogger, settings);
});
} else if (!isOwningVariables(constructor->nestedIn->varlist)) {
} else if (isOwningVariables(constructor->nestedIn->varlist, args)) {
LifetimeStore::forEach(args,
"Passed to constructor of '" + name + "'.",
ValueFlow::Value::LifetimeKind::SubObject,
Expand Down
13 changes: 13 additions & 0 deletions test/testautovariables.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3649,6 +3649,19 @@ class TestAutoVariables : public TestFixture {
"}\n",
true);
ASSERT_EQUALS("", errout.str());

check("struct S {\n"
" explicit S(const char* p) { m = p; }\n"
" void g();\n"
" std::string m;\n"
" int* t{};\n"
"};\n"
"void f(const std::stringstream& buffer) {\n"
" S s(buffer.str().c_str());\n"
" s.g();\n"
"}\n",
true);
ASSERT_EQUALS("", errout.str());
}

void danglingLifetimeAggegrateConstructor() {
Expand Down

0 comments on commit e9f369d

Please sign in to comment.