llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: geoffreygaren

<details>
<summary>Changes</summary>

So an upcoming borrow checker can skip it.

(A guardian variable is an independent declaration that ensures a lifetime. 
Borrow checking does not accept guardian variables because they do not convey 
`lifetimebound` links.)

Assisted-by: Claude

---
Full diff: https://github.com/llvm/llvm-project/pull/224726.diff


1 Files Affected:

- (modified) 
clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp (+30-31) 


``````````diff
diff --git 
a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp
index b0ebfea4b14108..e67808fd407eb2 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp
@@ -372,42 +372,41 @@ class RawPtrRefLocalVarsChecker
           if (Model->isSafeExpr(InitArgOrigin))
             return true;
 
-          if (auto *Ref = llvm::dyn_cast<DeclRefExpr>(InitArgOrigin)) {
-            if (auto *MaybeGuardian =
-                    dyn_cast_or_null<VarDecl>(Ref->getFoundDecl())) {
-              const auto *MaybeGuardianArgType =
-                  MaybeGuardian->getType().getTypePtr();
-              if (MaybeGuardianArgType) {
-                const CXXRecordDecl *const MaybeGuardianArgCXXRecord =
-                    MaybeGuardianArgType->getAsCXXRecordDecl();
-                if (MaybeGuardianArgCXXRecord) {
-                  if (MaybeGuardian->isLocalVarDecl() &&
-                      (Model->isSafePtr(MaybeGuardianArgCXXRecord) ||
-                       isRefcountedStringsHack(MaybeGuardian)) &&
-                      isGuardedScopeEmbeddedInGuardianScope(V, MaybeGuardian))
-                    return true;
-                }
-              }
-
-              if (isa<ParmVarDecl>(MaybeGuardian)) {
-                if (auto *FD = dyn_cast<FunctionDecl>(DeclWithIssue)) {
-                  if (GuardianVisitor{MaybeGuardian}.TraverseStmt(
-                          FD->getBody()))
-                    return true;
-                }
-                if (auto *MD = dyn_cast<ObjCMethodDecl>(DeclWithIssue)) {
-                  if (GuardianVisitor{MaybeGuardian}.TraverseStmt(
-                          MD->getBody()))
-                    return true;
-                }
-              }
-            }
-          }
+          if (hasGuardian(V, InitArgOrigin, DeclWithIssue))
+            return true;
 
           return false;
         });
   }
 
+  bool hasGuardian(const VarDecl *V, const Expr *InitArgOrigin,
+                   const Decl *DeclWithIssue) const {
+    auto *Ref = dyn_cast<DeclRefExpr>(InitArgOrigin);
+    if (!Ref)
+      return false;
+
+    auto *MaybeGuardian = dyn_cast_or_null<VarDecl>(Ref->getFoundDecl());
+    if (!MaybeGuardian)
+      return false;
+
+    if (auto *Record = MaybeGuardian->getType()->getAsCXXRecordDecl()) {
+      if (MaybeGuardian->isLocalVarDecl() &&
+          (Model->isSafePtr(Record) ||
+           isRefcountedStringsHack(MaybeGuardian)) &&
+          isGuardedScopeEmbeddedInGuardianScope(V, MaybeGuardian))
+        return true;
+    }
+
+    if (isa<ParmVarDecl>(MaybeGuardian)) {
+      if (auto *FD = dyn_cast<FunctionDecl>(DeclWithIssue))
+        return GuardianVisitor{MaybeGuardian}.TraverseStmt(FD->getBody());
+      if (auto *MD = dyn_cast<ObjCMethodDecl>(DeclWithIssue))
+        return GuardianVisitor{MaybeGuardian}.TraverseStmt(MD->getBody());
+    }
+
+    return false;
+  }
+
   bool shouldSkipVarDecl(const VarDecl *V) const {
     assert(V);
     if (isa<ImplicitParamDecl>(V))

``````````

</details>


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

Reply via email to