[clang] [LifetimeSafety] Add support for `new`/`delete` (PR #192504)
Utkarsh Saxena via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 21 06:38:15 PDT 2026
================
@@ -185,45 +185,60 @@ class LifetimeChecker {
}
}
- /// Checks for use-after-invalidation errors when a container is modified.
- ///
- /// This method identifies origins that are live at the point of invalidation
- /// and checks if they hold loans that are invalidated by the operation
- /// (e.g., iterators into a vector that is being pushed to).
- void checkInvalidation(const InvalidateOriginFact *IOF) {
- OriginID InvalidatedOrigin = IOF->getInvalidatedOrigin();
- /// Get loans directly pointing to the invalidated container
+ /// Records warnings for live loans whose access paths match loans directly
+ /// held by the `InvalidatedOrigin`.
+ /// \param InvalidatingExpr The invalidating expression.
+ /// \param InvalidatedOrigin The origin being invalidated.
+ /// \param PP The fact where the invalidation happens.
+ void checkLiveLoansForInvalidation(const Expr *InvalidatingExpr,
+ OriginID InvalidatedOrigin,
+ ProgramPoint PP) {
+
LoanSet DirectlyInvalidatedLoans =
- LoanPropagation.getLoans(InvalidatedOrigin, IOF);
- auto IsInvalidated = [&](const Loan *L) {
+ LoanPropagation.getLoans(InvalidatedOrigin, PP);
+
+ auto IsInvalidated = [&](const LoanID LID) {
+ const Loan *L = FactMgr.getLoanMgr().getLoan(LID);
for (LoanID InvalidID : DirectlyInvalidatedLoans) {
const Loan *InvalidL = FactMgr.getLoanMgr().getLoan(InvalidID);
if (InvalidL->getAccessPath() == L->getAccessPath())
return true;
}
return false;
};
+
// For each live origin, check if it holds an invalidated loan and report.
- LivenessMap Origins = LiveOrigins.getLiveOriginsAt(IOF);
- for (auto &[OID, LiveInfo] : Origins) {
- LoanSet HeldLoans = LoanPropagation.getLoans(OID, IOF);
- for (LoanID LiveLoanID : HeldLoans)
- if (IsInvalidated(FactMgr.getLoanMgr().getLoan(LiveLoanID))) {
- bool CurDomination = causingFactDominatesExpiry(LiveInfo.Kind);
- bool LastDomination =
- FinalWarningsMap.lookup(LiveLoanID).CausingFactDominatesExpiry;
- if (!LastDomination) {
- FinalWarningsMap[LiveLoanID] = {
- /*ExpiryLoc=*/{},
- /*CausingFact=*/LiveInfo.CausingFact,
- /*MovedExpr=*/nullptr,
- /*InvalidatedByExpr=*/IOF->getInvalidationExpr(),
- /*CausingFactDominatesExpiry=*/CurDomination};
- }
+ for (auto &[OID, LiveInfo] : LiveOrigins.getLiveOriginsAt(PP)) {
+ LoanSet HeldLoans = LoanPropagation.getLoans(OID, PP);
+ for (LoanID HeldLoan : HeldLoans) {
+ if (!IsInvalidated(HeldLoan))
+ continue;
+
+ bool CurDomination = causingFactDominatesExpiry(LiveInfo.Kind);
+ bool LastDomination =
+ FinalWarningsMap.lookup(HeldLoan).CausingFactDominatesExpiry;
+ if (!LastDomination) {
+ FinalWarningsMap[HeldLoan] = {
+ /*ExpiryLoc=*/{},
+ /*CausingFact=*/LiveInfo.CausingFact,
+ /*MovedExpr=*/nullptr,
+ /*InvalidatedByExpr=*/InvalidatingExpr,
+ /*CausingFactDominatesExpiry=*/CurDomination};
}
+ }
}
}
+ /// Checks for use-after-invalidation errors when a container is modified.
+ ///
+ /// This method identifies origins that are live at the point of invalidation
+ /// and checks if they hold loans that are invalidated by the operation
+ /// (e.g., iterators into a vector that is being pushed to).
+ void checkInvalidation(const InvalidateOriginFact *IOF) {
----------------
usx95 wrote:
Since now we only have one user, consider restoring to previous state where this was all inlined in `checkInvalidation`.
https://github.com/llvm/llvm-project/pull/192504
More information about the cfe-commits
mailing list