================
@@ -858,6 +858,13 @@ void FactsGenerator::handleExitBlock() {
             FactMgr.createFact<GlobalEscapeFact>(O.ID, VD));
       }
     }
+
+  // A borrow captured via [[clang::lifetime_capture_by(this)]] flows into the
+  // never-expiring `this` origin, so it is not otherwise live at the captured
+  // local's expiry. Keep `this` live at exit so the dangle is caught.
+  if (auto ThisOrigins = FactMgr.getOriginMgr().getThisOrigins())
+    EscapesInCurrentBlock.push_back(FactMgr.createFact<ThisEscapeFact>(
+        (*ThisOrigins)->getOuterOriginID(), AC.getDecl()->getEndLoc()));
----------------
Xazax-hun wrote:

In static analysis escape usually means something along the lines that we can 
no longer reason about something. It escaped our analysis. Since we do function 
local reasoning, any value that persists somewhere after the function returned 
are escaped. We do not know what will happen to them but chances are good they 
got persisted because they will be used later. So we assume if a value escaped, 
it will be used somewhere outside of this function. Since the value of `this` 
is observable after a method returns, it escaped our analysis and the caller 
can potentially use any value that is reachable from `this`. 

https://github.com/llvm/llvm-project/pull/204630
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to