[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