[llvm-branch-commits] [clang] [analyzer] Only underline the exact parameter that is bound to the return value in UseAfterLifetimeEnd (PR #215651)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Aug 11 14:00:18 PDT 2026
================
@@ -43,20 +43,30 @@ class UseAfterLifetimeEndBRVisitor : public BugReporterVisitor {
} // namespace
-static const Expr *getLifetimeBoundArg(const Expr *RetExpr) {
+static const Expr *getLifetimeBoundArg(const Expr *RetExpr,
+ const MemRegion *Region,
+ const ExplodedNode *N) {
const CallExpr *Expr = dyn_cast_or_null<CallExpr>(RetExpr);
if (!Expr)
return nullptr;
+
const FunctionDecl *FD = Expr->getDirectCallee();
if (!FD)
return nullptr;
+ const MemRegion *BaseReg = Region->getBaseRegion();
+
for (const ParmVarDecl *PVD : FD->parameters()) {
- if (PVD->hasAttr<LifetimeBoundAttr>()) {
- unsigned Idx = PVD->getFunctionScopeIndex();
- if (Idx < Expr->getNumArgs())
- return Expr->getArg(Idx);
- }
+ if (!PVD->hasAttr<LifetimeBoundAttr>())
+ continue;
+ unsigned Idx = PVD->getFunctionScopeIndex();
+
+ if (Idx >= Expr->getNumArgs())
+ continue;
+
+ const MemRegion *R = N->getSVal(Expr->getArg(Idx)).getAsRegion();
+ if (R && R->getBaseRegion() == BaseReg)
+ return Expr->getArg(Idx);
----------------
isuckatcs wrote:
Isn't is possible that multiple arguments are lifetime bound? I think we might want to report all of them.
```c++
struct S {
int *x;
int *y;
};
S foo(int *x [[clang::lifetimebound]], int *y [[clang::lifetimebound]]) {
return S{x, y};
}
```
https://github.com/llvm/llvm-project/pull/215651
More information about the llvm-branch-commits
mailing list