[clang] [clang] Fix dangling false positives for conditional operators. (PR #120233)
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 17 12:56:50 PST 2024
================
@@ -582,6 +582,15 @@ static void visitFunctionCallArguments(IndirectLocalPath &Path, Expr *Call,
// Temp().ptr; // Here ptr might not dangle.
if (isa<MemberExpr>(Arg->IgnoreImpCasts()))
return;
+ // Avoid false positives when the object is constructed from a conditional
+ // operator argument. A common case is:
+ // // 'ptr' might not be owned by the Owner object.
+ // std::string_view s = cond() ? Owner().ptr : sv;
----------------
hokein wrote:
> I am wondering if it was possible to use the same or similar MemberExpr filter when we drill down to the branches of the conditional operator. If it is too hard to do,
This was my first approach. We could add a special `MemberExpr` filter inside the `do-while` loop in `visitLocalsRetainedByReferenceBinding`, but I don’t think it’s a good idea:
- the filtering logic is GSL-pointer specific, and `visitLocalsRetainedByReferenceBinding` shouldn’t be aware of it; (layering violation)
- adding such filtering causes new false negatives in cases like `const string_view& sv = Owner().sv;`.
- it would scatter the special filtering logic into another place, making the code harder to reason about.
https://github.com/llvm/llvm-project/pull/120233
More information about the cfe-commits
mailing list