[clang] [alpha.webkit.NoUnretainedMemberChecker] Ignore system-header-defined ivar / property of a forward declared type (PR #133755)

Ryosuke Niwa via cfe-commits cfe-commits at lists.llvm.org
Mon Mar 31 10:17:19 PDT 2025


https://github.com/rniwa updated https://github.com/llvm/llvm-project/pull/133755

>From 0fb864bc5ae7d2b58879a6ad59babffe722bbf72 Mon Sep 17 00:00:00 2001
From: Ryosuke Niwa <rniwa at webkit.org>
Date: Mon, 31 Mar 2025 10:11:10 -0700
Subject: [PATCH 1/2] [alpha.webkit.NoUnretainedMemberChecker] Ignore
 system-header-defined ivar / property of a forward declared type

Prior to this PR, we were emitting warnings for Objective-C ivars and properties if the forward declaration of
the type appeared first in a non-system header. This PR fixes the checker so tha we'd ignore ivars and properties
defined for a forward declared type.
---
 .../Checkers/WebKit/RawPtrRefMemberChecker.cpp               | 5 +++++
 clang/test/Analysis/Checkers/WebKit/unretained-members.mm    | 2 ++
 2 files changed, 7 insertions(+)

diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp
index 89df1a725ab92..233bd8471bf89 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp
@@ -133,6 +133,8 @@ class RawPtrRefMemberChecker
 
   void visitIvarDecl(const ObjCContainerDecl *CD,
                      const ObjCIvarDecl *Ivar) const {
+    if (BR->getSourceManager().isInSystemHeader(Ivar->getLocation()))
+      return;
     auto QT = Ivar->getType();
     const Type *IvarType = QT.getTypePtrOrNull();
     if (!IvarType)
@@ -154,6 +156,8 @@ class RawPtrRefMemberChecker
 
   void visitObjCPropertyDecl(const ObjCContainerDecl *CD,
                              const ObjCPropertyDecl *PD) const {
+    if (BR->getSourceManager().isInSystemHeader(PD->getLocation()))
+      return;
     auto QT = PD->getType();
     const Type *PropType = QT.getTypePtrOrNull();
     if (!PropType)
@@ -241,6 +245,7 @@ class RawPtrRefMemberChecker
                                  BR->getSourceManager());
     auto Report = std::make_unique<BasicBugReport>(Bug, Os.str(), BSLoc);
     Report->addRange(Member->getSourceRange());
+    Report->setDeclWithIssue(ClassCXXRD);
     BR->emitReport(std::move(Report));
   }
 
diff --git a/clang/test/Analysis/Checkers/WebKit/unretained-members.mm b/clang/test/Analysis/Checkers/WebKit/unretained-members.mm
index 92d70a94427c0..fff1f8ede091b 100644
--- a/clang/test/Analysis/Checkers/WebKit/unretained-members.mm
+++ b/clang/test/Analysis/Checkers/WebKit/unretained-members.mm
@@ -1,5 +1,7 @@
 // RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.NoUnretainedMemberChecker -verify %s
 
+ at class SystemObject;
+
 #include "objc-mock-types.h"
 #include "mock-system-header.h"
 

>From 50d56ed8cbb213fe2d05cf0c5a46835d1900a7c8 Mon Sep 17 00:00:00 2001
From: Ryosuke Niwa <rniwa at webkit.org>
Date: Mon, 31 Mar 2025 10:17:01 -0700
Subject: [PATCH 2/2] Revert the unrelated change to set decl with issue.

---
 .../StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp    | 1 -
 1 file changed, 1 deletion(-)

diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp
index 233bd8471bf89..a003fc200727c 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp
@@ -245,7 +245,6 @@ class RawPtrRefMemberChecker
                                  BR->getSourceManager());
     auto Report = std::make_unique<BasicBugReport>(Bug, Os.str(), BSLoc);
     Report->addRange(Member->getSourceRange());
-    Report->setDeclWithIssue(ClassCXXRD);
     BR->emitReport(std::move(Report));
   }
 



More information about the cfe-commits mailing list