[clang] [alpha.webkit.UnretainedCallArgsChecker] Don't emit a warning for RetainPtr::operator= (PR #135526)

Ryosuke Niwa via cfe-commits cfe-commits at lists.llvm.org
Sun Apr 13 00:14:26 PDT 2025


https://github.com/rniwa created https://github.com/llvm/llvm-project/pull/135526

Generalize the check for operator= so that it works for RetainPtr and CheckedPtr instead of just RefPtr.

>From 6ca0049fdbc74a9f408b17d62260d6ff7d511ae4 Mon Sep 17 00:00:00 2001
From: Ryosuke Niwa <rniwa at webkit.org>
Date: Sun, 13 Apr 2025 00:11:03 -0700
Subject: [PATCH] [alpha.webkit.UnretainedCallArgsChecker] Don't emit a warning
 for RetainPtr::operator=

Generalize the check for operator= so that it works for RetainPtr and CheckedPtr
instead of just RefPtr.
---
 .../WebKit/RawPtrRefCallArgsChecker.cpp        |  2 +-
 .../Checkers/WebKit/call-args-checked.cpp      | 18 ++++++++++++++----
 .../test/Analysis/Checkers/WebKit/mock-types.h |  2 +-
 .../Analysis/Checkers/WebKit/objc-mock-types.h |  6 +-----
 .../Checkers/WebKit/unretained-call-args.mm    | 10 ++++++++++
 5 files changed, 27 insertions(+), 11 deletions(-)

diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp
index 20f7e9703c67c..51353d5acbae2 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefCallArgsChecker.cpp
@@ -264,7 +264,7 @@ class RawPtrRefCallArgsChecker
         auto *callee = MemberOp->getDirectCallee();
         if (auto *calleeDecl = dyn_cast<CXXMethodDecl>(callee)) {
           if (const CXXRecordDecl *classDecl = calleeDecl->getParent()) {
-            if (isRefCounted(classDecl))
+            if (isSafePtr(classDecl))
               return true;
           }
         }
diff --git a/clang/test/Analysis/Checkers/WebKit/call-args-checked.cpp b/clang/test/Analysis/Checkers/WebKit/call-args-checked.cpp
index 49b6bfcd7cadf..e24b04dcd3cf9 100644
--- a/clang/test/Analysis/Checkers/WebKit/call-args-checked.cpp
+++ b/clang/test/Analysis/Checkers/WebKit/call-args-checked.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncountedCallArgsChecker -verify %s
+// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncheckedCallArgsChecker -verify %s
 
 #include "mock-types.h"
 
@@ -10,10 +10,10 @@ namespace call_args_unchecked_uncounted {
 
 static void foo() {
   someFunction(makeObj());
-  // expected-warning at -1{{Call argument is uncounted and unsafe [alpha.webkit.UncountedCallArgsChecker]}}
+  // expected-warning at -1{{Call argument is unchecked and unsafe [alpha.webkit.UncheckedCallArgsChecker]}}
 }
 
-} // namespace call_args_checked
+} // namespace call_args_unchecked_uncounted
 
 namespace call_args_checked {
 
@@ -35,7 +35,7 @@ static void baz() {
 namespace call_args_default {
 
 void someFunction(RefCountableAndCheckable* = makeObj());
-// expected-warning at -1{{Call argument is uncounted and unsafe [alpha.webkit.UncountedCallArgsChecker]}}
+// expected-warning at -1{{Call argument is unchecked and unsafe [alpha.webkit.UncheckedCallArgsChecker]}}
 void otherFunction(RefCountableAndCheckable* = makeObjChecked().ptr());
 
 void foo() {
@@ -44,3 +44,13 @@ void foo() {
 }
 
 }
+
+namespace call_args_checked_assignment {
+
+CheckedObj* provide();
+void foo() {
+  CheckedPtr<CheckedObj> ptr;
+  ptr = provide();
+}
+
+}
diff --git a/clang/test/Analysis/Checkers/WebKit/mock-types.h b/clang/test/Analysis/Checkers/WebKit/mock-types.h
index a1f0cc8b046b9..a03d31870ee0d 100644
--- a/clang/test/Analysis/Checkers/WebKit/mock-types.h
+++ b/clang/test/Analysis/Checkers/WebKit/mock-types.h
@@ -249,7 +249,7 @@ template <typename T> struct CheckedPtr {
   T *get() const { return t; }
   T *operator->() const { return t; }
   T &operator*() const { return *t; }
-  CheckedPtr &operator=(T *) { return *this; }
+  CheckedPtr &operator=(T *);
   operator bool() const { return t; }
 };
 
diff --git a/clang/test/Analysis/Checkers/WebKit/objc-mock-types.h b/clang/test/Analysis/Checkers/WebKit/objc-mock-types.h
index 3f075ca0a6e5b..51de81ac0f033 100644
--- a/clang/test/Analysis/Checkers/WebKit/objc-mock-types.h
+++ b/clang/test/Analysis/Checkers/WebKit/objc-mock-types.h
@@ -216,11 +216,7 @@ template <typename T> struct RetainPtr {
   PtrType get() const { return t; }
   PtrType operator->() const { return t; }
   T &operator*() const { return *t; }
-  RetainPtr &operator=(PtrType t) {
-    RetainPtr o(t);
-    swap(o);
-    return *this;
-  }
+  RetainPtr &operator=(PtrType t);
   PtrType leakRef()
   {
     PtrType s = t;
diff --git a/clang/test/Analysis/Checkers/WebKit/unretained-call-args.mm b/clang/test/Analysis/Checkers/WebKit/unretained-call-args.mm
index dd21864300387..0667e4964f1a8 100644
--- a/clang/test/Analysis/Checkers/WebKit/unretained-call-args.mm
+++ b/clang/test/Analysis/Checkers/WebKit/unretained-call-args.mm
@@ -271,6 +271,16 @@ void foo() {
   }
 }
 
+namespace cxx_assignment_op {
+
+  SomeObj* provide();
+  void foo() {
+    RetainPtr<SomeObj> ptr;
+    ptr = provide();
+  }
+
+}
+
 namespace call_with_ptr_on_ref {
   RetainPtr<SomeObj> provideProtected();
   RetainPtr<CFMutableArrayRef> provideProtectedCF();



More information about the cfe-commits mailing list