https://github.com/rniwa created https://github.com/llvm/llvm-project/pull/137476
WebKit repalced its use of WTF::bitwise_cast with std::bit_cast. Add the support for recognizing it as a pointer conversion. >From c76e86105b5ba03cc2a3c8399670b2b38eb8e6ea Mon Sep 17 00:00:00 2001 From: Ryosuke Niwa <rn...@webkit.org> Date: Sat, 26 Apr 2025 14:03:13 -0700 Subject: [PATCH] [WebKit checkers] Treat std::bit_cast as a pointer conversion WebKit repalced its use of WTF::bitwise_cast with std::bit_cast. Add the support for recognizing it as a pointer conversion. --- .../Checkers/WebKit/PtrTypesSemantics.cpp | 2 +- .../Checkers/WebKit/call-args-checked-ptr.cpp | 8 ++++---- .../Analysis/Checkers/WebKit/call-args.cpp | 18 +++++++++--------- .../Checkers/WebKit/uncounted-obj-arg.cpp | 5 +++++ 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp index d7111bcb35115..edcf8e4feae4f 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp @@ -462,7 +462,7 @@ bool isPtrConversion(const FunctionDecl *F) { const auto FunctionName = safeGetName(F); if (FunctionName == "getPtr" || FunctionName == "WeakPtr" || FunctionName == "dynamicDowncast" || FunctionName == "downcast" || - FunctionName == "checkedDowncast" || + FunctionName == "checkedDowncast" || FunctionName == "bit_cast" || FunctionName == "uncheckedDowncast" || FunctionName == "bitwise_cast" || FunctionName == "bridge_cast" || FunctionName == "bridge_id_cast" || FunctionName == "dynamic_cf_cast" || FunctionName == "checked_cf_cast" || diff --git a/clang/test/Analysis/Checkers/WebKit/call-args-checked-ptr.cpp b/clang/test/Analysis/Checkers/WebKit/call-args-checked-ptr.cpp index 59f247d6d007c..d539891ed832d 100644 --- a/clang/test/Analysis/Checkers/WebKit/call-args-checked-ptr.cpp +++ b/clang/test/Analysis/Checkers/WebKit/call-args-checked-ptr.cpp @@ -173,14 +173,14 @@ namespace param_formarding_function { namespace casts { - CheckedObj* downcast(CheckedObj*) { return nullptr; } - - template<class T> - T* bitwise_cast(T*) { return nullptr; } + CheckedObj* downcast(CheckedObj*); + template<class T> T* bitwise_cast(T*); + template<class T> T* bit_cast(T*); void foo(CheckedObj* param) { consume_ref_countable_ptr(downcast(param)); consume_ref_countable_ptr(bitwise_cast(param)); + consume_ref_countable_ptr(bit_cast(param)); } } } diff --git a/clang/test/Analysis/Checkers/WebKit/call-args.cpp b/clang/test/Analysis/Checkers/WebKit/call-args.cpp index d95ae9216edcf..1a8bde29080ac 100644 --- a/clang/test/Analysis/Checkers/WebKit/call-args.cpp +++ b/clang/test/Analysis/Checkers/WebKit/call-args.cpp @@ -173,15 +173,15 @@ namespace param_formarding_function { namespace casts { - RefCountable* downcast(RefCountable*) { return nullptr; } - - template<class T> - T* bitwise_cast(T*) { return nullptr; } - - void foo(RefCountable* param) { - consume_ref_countable_ptr(downcast(param)); - consume_ref_countable_ptr(bitwise_cast(param)); - } + RefCountable* downcast(RefCountable*); + template<class T> T* bitwise_cast(T*); + template<class T> T* bit_cast(T*); + + void foo(RefCountable* param) { + consume_ref_countable_ptr(downcast(param)); + consume_ref_countable_ptr(bitwise_cast(param)); + consume_ref_countable_ptr(bit_cast(param)); + } } } diff --git a/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp index 69842264af56b..2c6ccb55e2ce8 100644 --- a/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp +++ b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp @@ -77,6 +77,9 @@ T&& forward(T& arg); template<typename T> T&& move( T&& t ); +template<typename ToType, typename FromType> +ToType bit_cast(FromType from); + #define offsetof(t, d) __builtin_offsetof(t, d) } // namespace std @@ -386,6 +389,7 @@ class RefCounted { void trivial68() { point pt = { 1.0 }; } unsigned trivial69() { return offsetof(OtherObj, children); } DerivedNumber* trivial70() { [[clang::suppress]] return static_cast<DerivedNumber*>(number); } + unsigned trivial71() { return std::bit_cast<unsigned>(nullptr); } static RefCounted& singleton() { static RefCounted s_RefCounted; @@ -577,6 +581,7 @@ class UnrelatedClass { getFieldTrivial().trivial68(); // no-warning getFieldTrivial().trivial69(); // no-warning getFieldTrivial().trivial70(); // no-warning + getFieldTrivial().trivial71(); // no-warning RefCounted::singleton().trivial18(); // no-warning RefCounted::singleton().someFunction(); // no-warning _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits