[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