[clang] [LifetimeSafety] Model scope-exit destructor and cleanup callback as a use (PR #204650)
Gábor Horváth via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 22 08:32:21 PDT 2026
================
@@ -792,6 +757,20 @@ void FactsGenerator::handleLifetimeEnds(const CFGLifetimeEnds &LifetimeEnds) {
const VarDecl *LifetimeEndsVD = LifetimeEnds.getVarDecl();
if (!LifetimeEndsVD)
return;
+ // A non-trivial destructor at scope exit may read a borrow the object holds
+ // (e.g. a [[gsl::Pointer]] whose out-of-line ~T() dereferences its view). The
+ // analysis never sees that body, so model the destruction as a use, keeping
+ // the borrow live to that point so a borrowed-from object destroyed earlier
+ // (reverse-declaration order) is reported. Owners are excluded: their
+ // destruction frees their own storage (modeled by the ExpireFact), not a
+ // borrow into another object.
+ QualType VDTy = LifetimeEndsVD->getType();
+ if (const CXXRecordDecl *RD = VDTy->getAsCXXRecordDecl();
+ RD && RD->hasDefinition() && RD->hasNonTrivialDestructor() &&
+ !isGslOwnerType(VDTy) && hasOrigins(VDTy))
----------------
Xazax-hun wrote:
Added.
https://github.com/llvm/llvm-project/pull/204650
More information about the cfe-commits
mailing list