From 83d0b064c88df718e13bb8d6b4182ec635f7b03b Mon Sep 17 00:00:00 2001 From: Alan Wu Date: Thu, 9 Oct 2025 13:02:10 -0400 Subject: [PATCH 1/6] ZJIT: Use clang-16 for bindgen on CI Since many of us developing ZJIT are on at least Clang 16 locally now due to recent macOS update, let's use Clang 16 on CI, too. There is some differences between https://github.com/llvm/llvm-project Clang and Apple Clang, even when the version number match, but I figure it's good to shrink the difference anyways. --- .github/workflows/zjit-ubuntu.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/zjit-ubuntu.yml b/.github/workflows/zjit-ubuntu.yml index a30ff1df88fdd9..02afda470aec47 100644 --- a/.github/workflows/zjit-ubuntu.yml +++ b/.github/workflows/zjit-ubuntu.yml @@ -69,8 +69,9 @@ jobs: - test_task: 'zjit-bindgen' hint: 'To fix: use patch in logs' - configure: '--enable-zjit=dev --with-gcc=clang-14' - libclang_path: '/usr/lib/llvm-14/lib/libclang.so.1' + configure: '--enable-zjit=dev --with-gcc=clang-16' + clang_path: '/usr/bin/clang-16' + runs-on: 'ubuntu-24.04' # for clang-16 - test_task: 'test-bundled-gems' configure: '--enable-zjit=dev' @@ -87,7 +88,7 @@ jobs: RUST_BACKTRACE: 1 ZJIT_RB_BUG: 1 - runs-on: ubuntu-22.04 + runs-on: ${{ matrix.runs-on || 'ubuntu-22.04' }} if: >- ${{!(false @@ -175,7 +176,7 @@ jobs: PRECHECK_BUNDLED_GEMS: 'no' SYNTAX_SUGGEST_TIMEOUT: '5' ZJIT_BINDGEN_DIFF_OPTS: '--exit-code' - LIBCLANG_PATH: ${{ matrix.libclang_path }} + CLANG_PATH: ${{ matrix.clang_path }} TESTS: ${{ matrix.test_all_opts }} continue-on-error: ${{ matrix.continue-on-test_task || false }} From 864e8fb029b10bfe2af14d679600d22e33d7ea35 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 10 Oct 2025 07:37:27 +0900 Subject: [PATCH 2/6] win32: Enable extensions explicitly --- win32/configure.bat | 2 +- win32/ifchange.bat | 2 ++ win32/install-buildtools.cmd | 2 +- win32/lastrev.bat | 3 ++- win32/makedirs.bat | 2 +- win32/rm.bat | 2 +- win32/rmdirs.bat | 2 +- win32/rtname.cmd | 1 + win32/vssetup.cmd | 2 +- 9 files changed, 11 insertions(+), 7 deletions(-) diff --git a/win32/configure.bat b/win32/configure.bat index 79384a87590067..8f767ede73256a 100755 --- a/win32/configure.bat +++ b/win32/configure.bat @@ -1,5 +1,5 @@ @echo off -@setlocal disabledelayedexpansion +@setlocal EnableExtensions DisableDelayedExpansion || exit /b -1 set PROMPT=$E[94m+$E[m$S set witharg= diff --git a/win32/ifchange.bat b/win32/ifchange.bat index c7a57fad3583c4..f3fc9ea37c6203 100755 --- a/win32/ifchange.bat +++ b/win32/ifchange.bat @@ -1,6 +1,8 @@ @echo off :: usage: ifchange target temporary +@setlocal EnableExtensions DisableDelayedExpansion || exit /b -1 + :: @set PROMPT=$T:$S for %%I in (%0) do set progname=%%~nI set timestamp= diff --git a/win32/install-buildtools.cmd b/win32/install-buildtools.cmd index 6ec147528000db..fbbe051f717b3e 100755 --- a/win32/install-buildtools.cmd +++ b/win32/install-buildtools.cmd @@ -1,5 +1,5 @@ @echo off -setlocal +@setlocal EnableExtensions DisableDelayedExpansion || exit /b -1 set components=VC.Tools.x86.x64 VC.Redist.14.Latest CoreBuildTools set components=%components% Windows11SDK.26100 diff --git a/win32/lastrev.bat b/win32/lastrev.bat index f1c799f8976f2c..c4ce61e34abe82 100755 --- a/win32/lastrev.bat +++ b/win32/lastrev.bat @@ -1,5 +1,6 @@ -@setlocal @echo off +@setlocal EnableExtensions DisableDelayedExpansion || exit /b -1 + if "%1" == "" (set gitdir=.) else (set gitdir=%1) set TZ=UTC for /f "usebackq tokens=1-3" %%I in ( diff --git a/win32/makedirs.bat b/win32/makedirs.bat index 13740d877809ed..8c06d94041c46b 100755 --- a/win32/makedirs.bat +++ b/win32/makedirs.bat @@ -1,3 +1,3 @@ @echo off -setlocal EnableExtensions +@setlocal EnableExtensions DisableDelayedExpansion || exit /b -1 for %%I in (%*) do if not exist "%%~I/." mkdir "%%~I" diff --git a/win32/rm.bat b/win32/rm.bat index fefc0305458e57..500a4abe2e5562 100755 --- a/win32/rm.bat +++ b/win32/rm.bat @@ -1,5 +1,5 @@ @echo off -setlocal +@setlocal EnableExtensions DisableDelayedExpansion || exit /b -1 set recursive= :optloop if "%1" == "-f" shift diff --git a/win32/rmdirs.bat b/win32/rmdirs.bat index 308b6483229353..c3d7b637b3ea2a 100755 --- a/win32/rmdirs.bat +++ b/win32/rmdirs.bat @@ -1,5 +1,5 @@ -::-*- batch -*- @echo off +@setlocal EnableExtensions DisableDelayedExpansion || exit /b -1 if "%1" == "-p" shift :begin if "%1" == "" goto :end diff --git a/win32/rtname.cmd b/win32/rtname.cmd index 775e81681a5c6c..1ac008ebf06d3c 100755 --- a/win32/rtname.cmd +++ b/win32/rtname.cmd @@ -1,4 +1,5 @@ @echo off +@setlocal EnableExtensions DisableDelayedExpansion || exit /b -1 set rt= set rtver= set osver= diff --git a/win32/vssetup.cmd b/win32/vssetup.cmd index c67bb0ad7c07de..2bbfbf1384f27e 100755 --- a/win32/vssetup.cmd +++ b/win32/vssetup.cmd @@ -1,4 +1,4 @@ -@setlocal ENABLEEXTENSIONS +@setlocal EnableExtensions DisableDelayedExpansion || exit /b -1 ::- do not `echo off` that affects the called batch files ::- check for vswhere From 04ed9c1a7c44c780305a33ad5e7871f475fc181f Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 7 Oct 2025 20:58:49 -0400 Subject: [PATCH 3/6] Rename ext/-test-/asan to ext/-test-/sanitizers --- ext/-test-/asan/depend | 162 ------------------ ext/-test-/asan/extconf.rb | 2 - ext/-test-/sanitizers/depend | 162 ++++++++++++++++++ ext/-test-/sanitizers/extconf.rb | 2 + .../{asan/asan.c => sanitizers/sanitizers.c} | 4 +- tool/lib/core_assertions.rb | 4 +- 6 files changed, 168 insertions(+), 168 deletions(-) delete mode 100644 ext/-test-/asan/depend delete mode 100644 ext/-test-/asan/extconf.rb create mode 100644 ext/-test-/sanitizers/depend create mode 100644 ext/-test-/sanitizers/extconf.rb rename ext/-test-/{asan/asan.c => sanitizers/sanitizers.c} (84%) diff --git a/ext/-test-/asan/depend b/ext/-test-/asan/depend deleted file mode 100644 index 93cdc739ec63b7..00000000000000 --- a/ext/-test-/asan/depend +++ /dev/null @@ -1,162 +0,0 @@ -# AUTOGENERATED DEPENDENCIES START -asan.o: $(RUBY_EXTCONF_H) -asan.o: $(arch_hdrdir)/ruby/config.h -asan.o: $(hdrdir)/ruby/assert.h -asan.o: $(hdrdir)/ruby/backward.h -asan.o: $(hdrdir)/ruby/backward/2/assume.h -asan.o: $(hdrdir)/ruby/backward/2/attributes.h -asan.o: $(hdrdir)/ruby/backward/2/bool.h -asan.o: $(hdrdir)/ruby/backward/2/inttypes.h -asan.o: $(hdrdir)/ruby/backward/2/limits.h -asan.o: $(hdrdir)/ruby/backward/2/long_long.h -asan.o: $(hdrdir)/ruby/backward/2/stdalign.h -asan.o: $(hdrdir)/ruby/backward/2/stdarg.h -asan.o: $(hdrdir)/ruby/defines.h -asan.o: $(hdrdir)/ruby/intern.h -asan.o: $(hdrdir)/ruby/internal/abi.h -asan.o: $(hdrdir)/ruby/internal/anyargs.h -asan.o: $(hdrdir)/ruby/internal/arithmetic.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/char.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/double.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/int.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/long.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/short.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h -asan.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h -asan.o: $(hdrdir)/ruby/internal/assume.h -asan.o: $(hdrdir)/ruby/internal/attr/alloc_size.h -asan.o: $(hdrdir)/ruby/internal/attr/artificial.h -asan.o: $(hdrdir)/ruby/internal/attr/cold.h -asan.o: $(hdrdir)/ruby/internal/attr/const.h -asan.o: $(hdrdir)/ruby/internal/attr/constexpr.h -asan.o: $(hdrdir)/ruby/internal/attr/deprecated.h -asan.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h -asan.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h -asan.o: $(hdrdir)/ruby/internal/attr/error.h -asan.o: $(hdrdir)/ruby/internal/attr/flag_enum.h -asan.o: $(hdrdir)/ruby/internal/attr/forceinline.h -asan.o: $(hdrdir)/ruby/internal/attr/format.h -asan.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h -asan.o: $(hdrdir)/ruby/internal/attr/noalias.h -asan.o: $(hdrdir)/ruby/internal/attr/nodiscard.h -asan.o: $(hdrdir)/ruby/internal/attr/noexcept.h -asan.o: $(hdrdir)/ruby/internal/attr/noinline.h -asan.o: $(hdrdir)/ruby/internal/attr/nonnull.h -asan.o: $(hdrdir)/ruby/internal/attr/noreturn.h -asan.o: $(hdrdir)/ruby/internal/attr/packed_struct.h -asan.o: $(hdrdir)/ruby/internal/attr/pure.h -asan.o: $(hdrdir)/ruby/internal/attr/restrict.h -asan.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h -asan.o: $(hdrdir)/ruby/internal/attr/warning.h -asan.o: $(hdrdir)/ruby/internal/attr/weakref.h -asan.o: $(hdrdir)/ruby/internal/cast.h -asan.o: $(hdrdir)/ruby/internal/compiler_is.h -asan.o: $(hdrdir)/ruby/internal/compiler_is/apple.h -asan.o: $(hdrdir)/ruby/internal/compiler_is/clang.h -asan.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h -asan.o: $(hdrdir)/ruby/internal/compiler_is/intel.h -asan.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h -asan.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h -asan.o: $(hdrdir)/ruby/internal/compiler_since.h -asan.o: $(hdrdir)/ruby/internal/config.h -asan.o: $(hdrdir)/ruby/internal/constant_p.h -asan.o: $(hdrdir)/ruby/internal/core.h -asan.o: $(hdrdir)/ruby/internal/core/rarray.h -asan.o: $(hdrdir)/ruby/internal/core/rbasic.h -asan.o: $(hdrdir)/ruby/internal/core/rbignum.h -asan.o: $(hdrdir)/ruby/internal/core/rclass.h -asan.o: $(hdrdir)/ruby/internal/core/rdata.h -asan.o: $(hdrdir)/ruby/internal/core/rfile.h -asan.o: $(hdrdir)/ruby/internal/core/rhash.h -asan.o: $(hdrdir)/ruby/internal/core/robject.h -asan.o: $(hdrdir)/ruby/internal/core/rregexp.h -asan.o: $(hdrdir)/ruby/internal/core/rstring.h -asan.o: $(hdrdir)/ruby/internal/core/rstruct.h -asan.o: $(hdrdir)/ruby/internal/core/rtypeddata.h -asan.o: $(hdrdir)/ruby/internal/ctype.h -asan.o: $(hdrdir)/ruby/internal/dllexport.h -asan.o: $(hdrdir)/ruby/internal/dosish.h -asan.o: $(hdrdir)/ruby/internal/error.h -asan.o: $(hdrdir)/ruby/internal/eval.h -asan.o: $(hdrdir)/ruby/internal/event.h -asan.o: $(hdrdir)/ruby/internal/fl_type.h -asan.o: $(hdrdir)/ruby/internal/gc.h -asan.o: $(hdrdir)/ruby/internal/glob.h -asan.o: $(hdrdir)/ruby/internal/globals.h -asan.o: $(hdrdir)/ruby/internal/has/attribute.h -asan.o: $(hdrdir)/ruby/internal/has/builtin.h -asan.o: $(hdrdir)/ruby/internal/has/c_attribute.h -asan.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h -asan.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h -asan.o: $(hdrdir)/ruby/internal/has/extension.h -asan.o: $(hdrdir)/ruby/internal/has/feature.h -asan.o: $(hdrdir)/ruby/internal/has/warning.h -asan.o: $(hdrdir)/ruby/internal/intern/array.h -asan.o: $(hdrdir)/ruby/internal/intern/bignum.h -asan.o: $(hdrdir)/ruby/internal/intern/class.h -asan.o: $(hdrdir)/ruby/internal/intern/compar.h -asan.o: $(hdrdir)/ruby/internal/intern/complex.h -asan.o: $(hdrdir)/ruby/internal/intern/cont.h -asan.o: $(hdrdir)/ruby/internal/intern/dir.h -asan.o: $(hdrdir)/ruby/internal/intern/enum.h -asan.o: $(hdrdir)/ruby/internal/intern/enumerator.h -asan.o: $(hdrdir)/ruby/internal/intern/error.h -asan.o: $(hdrdir)/ruby/internal/intern/eval.h -asan.o: $(hdrdir)/ruby/internal/intern/file.h -asan.o: $(hdrdir)/ruby/internal/intern/hash.h -asan.o: $(hdrdir)/ruby/internal/intern/io.h -asan.o: $(hdrdir)/ruby/internal/intern/load.h -asan.o: $(hdrdir)/ruby/internal/intern/marshal.h -asan.o: $(hdrdir)/ruby/internal/intern/numeric.h -asan.o: $(hdrdir)/ruby/internal/intern/object.h -asan.o: $(hdrdir)/ruby/internal/intern/parse.h -asan.o: $(hdrdir)/ruby/internal/intern/proc.h -asan.o: $(hdrdir)/ruby/internal/intern/process.h -asan.o: $(hdrdir)/ruby/internal/intern/random.h -asan.o: $(hdrdir)/ruby/internal/intern/range.h -asan.o: $(hdrdir)/ruby/internal/intern/rational.h -asan.o: $(hdrdir)/ruby/internal/intern/re.h -asan.o: $(hdrdir)/ruby/internal/intern/ruby.h -asan.o: $(hdrdir)/ruby/internal/intern/select.h -asan.o: $(hdrdir)/ruby/internal/intern/select/largesize.h -asan.o: $(hdrdir)/ruby/internal/intern/set.h -asan.o: $(hdrdir)/ruby/internal/intern/signal.h -asan.o: $(hdrdir)/ruby/internal/intern/sprintf.h -asan.o: $(hdrdir)/ruby/internal/intern/string.h -asan.o: $(hdrdir)/ruby/internal/intern/struct.h -asan.o: $(hdrdir)/ruby/internal/intern/thread.h -asan.o: $(hdrdir)/ruby/internal/intern/time.h -asan.o: $(hdrdir)/ruby/internal/intern/variable.h -asan.o: $(hdrdir)/ruby/internal/intern/vm.h -asan.o: $(hdrdir)/ruby/internal/interpreter.h -asan.o: $(hdrdir)/ruby/internal/iterator.h -asan.o: $(hdrdir)/ruby/internal/memory.h -asan.o: $(hdrdir)/ruby/internal/method.h -asan.o: $(hdrdir)/ruby/internal/module.h -asan.o: $(hdrdir)/ruby/internal/newobj.h -asan.o: $(hdrdir)/ruby/internal/scan_args.h -asan.o: $(hdrdir)/ruby/internal/special_consts.h -asan.o: $(hdrdir)/ruby/internal/static_assert.h -asan.o: $(hdrdir)/ruby/internal/stdalign.h -asan.o: $(hdrdir)/ruby/internal/stdbool.h -asan.o: $(hdrdir)/ruby/internal/stdckdint.h -asan.o: $(hdrdir)/ruby/internal/symbol.h -asan.o: $(hdrdir)/ruby/internal/value.h -asan.o: $(hdrdir)/ruby/internal/value_type.h -asan.o: $(hdrdir)/ruby/internal/variable.h -asan.o: $(hdrdir)/ruby/internal/warning_push.h -asan.o: $(hdrdir)/ruby/internal/xmalloc.h -asan.o: $(hdrdir)/ruby/missing.h -asan.o: $(hdrdir)/ruby/ruby.h -asan.o: $(hdrdir)/ruby/st.h -asan.o: $(hdrdir)/ruby/subst.h -asan.o: asan.c -# AUTOGENERATED DEPENDENCIES END diff --git a/ext/-test-/asan/extconf.rb b/ext/-test-/asan/extconf.rb deleted file mode 100644 index ec02742b8145e4..00000000000000 --- a/ext/-test-/asan/extconf.rb +++ /dev/null @@ -1,2 +0,0 @@ -require 'mkmf' -create_makefile('-test-/asan') diff --git a/ext/-test-/sanitizers/depend b/ext/-test-/sanitizers/depend new file mode 100644 index 00000000000000..0e6e632803307e --- /dev/null +++ b/ext/-test-/sanitizers/depend @@ -0,0 +1,162 @@ +# AUTOGENERATED DEPENDENCIES START +sanitizers.o: $(RUBY_EXTCONF_H) +sanitizers.o: $(arch_hdrdir)/ruby/config.h +sanitizers.o: $(hdrdir)/ruby/assert.h +sanitizers.o: $(hdrdir)/ruby/backward.h +sanitizers.o: $(hdrdir)/ruby/backward/2/assume.h +sanitizers.o: $(hdrdir)/ruby/backward/2/attributes.h +sanitizers.o: $(hdrdir)/ruby/backward/2/bool.h +sanitizers.o: $(hdrdir)/ruby/backward/2/inttypes.h +sanitizers.o: $(hdrdir)/ruby/backward/2/limits.h +sanitizers.o: $(hdrdir)/ruby/backward/2/long_long.h +sanitizers.o: $(hdrdir)/ruby/backward/2/stdalign.h +sanitizers.o: $(hdrdir)/ruby/backward/2/stdarg.h +sanitizers.o: $(hdrdir)/ruby/defines.h +sanitizers.o: $(hdrdir)/ruby/intern.h +sanitizers.o: $(hdrdir)/ruby/internal/abi.h +sanitizers.o: $(hdrdir)/ruby/internal/anyargs.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/char.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/double.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/int.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/long.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/short.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +sanitizers.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +sanitizers.o: $(hdrdir)/ruby/internal/assume.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/artificial.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/cold.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/const.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/constexpr.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/deprecated.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/error.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/forceinline.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/format.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/noalias.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/noexcept.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/noinline.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/nonnull.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/noreturn.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/packed_struct.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/pure.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/restrict.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/warning.h +sanitizers.o: $(hdrdir)/ruby/internal/attr/weakref.h +sanitizers.o: $(hdrdir)/ruby/internal/cast.h +sanitizers.o: $(hdrdir)/ruby/internal/compiler_is.h +sanitizers.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +sanitizers.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +sanitizers.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +sanitizers.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +sanitizers.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +sanitizers.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +sanitizers.o: $(hdrdir)/ruby/internal/compiler_since.h +sanitizers.o: $(hdrdir)/ruby/internal/config.h +sanitizers.o: $(hdrdir)/ruby/internal/constant_p.h +sanitizers.o: $(hdrdir)/ruby/internal/core.h +sanitizers.o: $(hdrdir)/ruby/internal/core/rarray.h +sanitizers.o: $(hdrdir)/ruby/internal/core/rbasic.h +sanitizers.o: $(hdrdir)/ruby/internal/core/rbignum.h +sanitizers.o: $(hdrdir)/ruby/internal/core/rclass.h +sanitizers.o: $(hdrdir)/ruby/internal/core/rdata.h +sanitizers.o: $(hdrdir)/ruby/internal/core/rfile.h +sanitizers.o: $(hdrdir)/ruby/internal/core/rhash.h +sanitizers.o: $(hdrdir)/ruby/internal/core/robject.h +sanitizers.o: $(hdrdir)/ruby/internal/core/rregexp.h +sanitizers.o: $(hdrdir)/ruby/internal/core/rstring.h +sanitizers.o: $(hdrdir)/ruby/internal/core/rstruct.h +sanitizers.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +sanitizers.o: $(hdrdir)/ruby/internal/ctype.h +sanitizers.o: $(hdrdir)/ruby/internal/dllexport.h +sanitizers.o: $(hdrdir)/ruby/internal/dosish.h +sanitizers.o: $(hdrdir)/ruby/internal/error.h +sanitizers.o: $(hdrdir)/ruby/internal/eval.h +sanitizers.o: $(hdrdir)/ruby/internal/event.h +sanitizers.o: $(hdrdir)/ruby/internal/fl_type.h +sanitizers.o: $(hdrdir)/ruby/internal/gc.h +sanitizers.o: $(hdrdir)/ruby/internal/glob.h +sanitizers.o: $(hdrdir)/ruby/internal/globals.h +sanitizers.o: $(hdrdir)/ruby/internal/has/attribute.h +sanitizers.o: $(hdrdir)/ruby/internal/has/builtin.h +sanitizers.o: $(hdrdir)/ruby/internal/has/c_attribute.h +sanitizers.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +sanitizers.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +sanitizers.o: $(hdrdir)/ruby/internal/has/extension.h +sanitizers.o: $(hdrdir)/ruby/internal/has/feature.h +sanitizers.o: $(hdrdir)/ruby/internal/has/warning.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/array.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/bignum.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/class.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/compar.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/complex.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/cont.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/dir.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/enum.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/enumerator.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/error.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/eval.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/file.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/hash.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/io.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/load.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/marshal.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/numeric.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/object.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/parse.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/proc.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/process.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/random.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/range.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/rational.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/re.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/ruby.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/select.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/set.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/signal.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/sprintf.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/string.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/struct.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/thread.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/time.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/variable.h +sanitizers.o: $(hdrdir)/ruby/internal/intern/vm.h +sanitizers.o: $(hdrdir)/ruby/internal/interpreter.h +sanitizers.o: $(hdrdir)/ruby/internal/iterator.h +sanitizers.o: $(hdrdir)/ruby/internal/memory.h +sanitizers.o: $(hdrdir)/ruby/internal/method.h +sanitizers.o: $(hdrdir)/ruby/internal/module.h +sanitizers.o: $(hdrdir)/ruby/internal/newobj.h +sanitizers.o: $(hdrdir)/ruby/internal/scan_args.h +sanitizers.o: $(hdrdir)/ruby/internal/special_consts.h +sanitizers.o: $(hdrdir)/ruby/internal/static_assert.h +sanitizers.o: $(hdrdir)/ruby/internal/stdalign.h +sanitizers.o: $(hdrdir)/ruby/internal/stdbool.h +sanitizers.o: $(hdrdir)/ruby/internal/stdckdint.h +sanitizers.o: $(hdrdir)/ruby/internal/symbol.h +sanitizers.o: $(hdrdir)/ruby/internal/value.h +sanitizers.o: $(hdrdir)/ruby/internal/value_type.h +sanitizers.o: $(hdrdir)/ruby/internal/variable.h +sanitizers.o: $(hdrdir)/ruby/internal/warning_push.h +sanitizers.o: $(hdrdir)/ruby/internal/xmalloc.h +sanitizers.o: $(hdrdir)/ruby/missing.h +sanitizers.o: $(hdrdir)/ruby/ruby.h +sanitizers.o: $(hdrdir)/ruby/st.h +sanitizers.o: $(hdrdir)/ruby/subst.h +sanitizers.o: sanitizers.c +# AUTOGENERATED DEPENDENCIES END diff --git a/ext/-test-/sanitizers/extconf.rb b/ext/-test-/sanitizers/extconf.rb new file mode 100644 index 00000000000000..c94a96de6c5218 --- /dev/null +++ b/ext/-test-/sanitizers/extconf.rb @@ -0,0 +1,2 @@ +require 'mkmf' +create_makefile('-test-/sanitizers') diff --git a/ext/-test-/asan/asan.c b/ext/-test-/sanitizers/sanitizers.c similarity index 84% rename from ext/-test-/asan/asan.c rename to ext/-test-/sanitizers/sanitizers.c index 45b6253fdac8c8..2c55e7eb51e4e6 100644 --- a/ext/-test-/asan/asan.c +++ b/ext/-test-/sanitizers/sanitizers.c @@ -15,10 +15,10 @@ asan_enabled_p(VALUE self) } void -Init_asan(void) +Init_sanitizers(void) { VALUE m = rb_define_module("Test"); - VALUE c = rb_define_class_under(m, "ASAN", rb_cObject); + VALUE c = rb_define_class_under(m, "Sanitizers", rb_cObject); rb_define_singleton_method(c, "enabled?", asan_enabled_p, 0); } diff --git a/tool/lib/core_assertions.rb b/tool/lib/core_assertions.rb index cc4eb327d41106..5e2aefc7e0ef6a 100644 --- a/tool/lib/core_assertions.rb +++ b/tool/lib/core_assertions.rb @@ -74,7 +74,7 @@ def message msg = nil, ending = nil, &default module CoreAssertions require_relative 'envutil' require 'pp' - require '-test-/asan' + require '-test-/sanitizers' nil.pretty_inspect @@ -159,7 +159,7 @@ def assert_no_memory_leak(args, prepare, code, message=nil, limit: 2.0, rss: fal pend 'assert_no_memory_leak may consider MJIT memory usage as leak' if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled? # ASAN has the same problem - its shadow memory greatly increases memory usage # (plus asan has better ways to detect memory leaks than this assertion) - pend 'assert_no_memory_leak may consider ASAN memory usage as leak' if Test::ASAN.enabled? + pend 'assert_no_memory_leak may consider ASAN memory usage as leak' if Test::Sanitizers.enabled? require_relative 'memory_status' raise Test::Unit::PendedError, "unsupported platform" unless defined?(Memory::Status) From fc7fd63880dd8e22ac253330d1d07b8896fb7f39 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 7 Oct 2025 21:01:41 -0400 Subject: [PATCH 4/6] Rename Test::Sanitizers.enabled? to Test::Sanitizers.asan_enabled? --- ext/-test-/sanitizers/sanitizers.c | 2 +- tool/lib/core_assertions.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/-test-/sanitizers/sanitizers.c b/ext/-test-/sanitizers/sanitizers.c index 2c55e7eb51e4e6..bd00f0be774f11 100644 --- a/ext/-test-/sanitizers/sanitizers.c +++ b/ext/-test-/sanitizers/sanitizers.c @@ -19,6 +19,6 @@ Init_sanitizers(void) { VALUE m = rb_define_module("Test"); VALUE c = rb_define_class_under(m, "Sanitizers", rb_cObject); - rb_define_singleton_method(c, "enabled?", asan_enabled_p, 0); + rb_define_singleton_method(c, "asan_enabled?", asan_enabled_p, 0); } diff --git a/tool/lib/core_assertions.rb b/tool/lib/core_assertions.rb index 5e2aefc7e0ef6a..fc7b9402843303 100644 --- a/tool/lib/core_assertions.rb +++ b/tool/lib/core_assertions.rb @@ -159,7 +159,7 @@ def assert_no_memory_leak(args, prepare, code, message=nil, limit: 2.0, rss: fal pend 'assert_no_memory_leak may consider MJIT memory usage as leak' if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled? # ASAN has the same problem - its shadow memory greatly increases memory usage # (plus asan has better ways to detect memory leaks than this assertion) - pend 'assert_no_memory_leak may consider ASAN memory usage as leak' if Test::Sanitizers.enabled? + pend 'assert_no_memory_leak may consider ASAN memory usage as leak' if Test::Sanitizers.asan_enabled? require_relative 'memory_status' raise Test::Unit::PendedError, "unsupported platform" unless defined?(Memory::Status) From c80ff8da25333bac6beaff7b0cffd07b023f78e9 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 7 Oct 2025 21:01:59 -0400 Subject: [PATCH 5/6] Add Test::Sanitizers.lsan_enabled? --- ext/-test-/sanitizers/sanitizers.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ext/-test-/sanitizers/sanitizers.c b/ext/-test-/sanitizers/sanitizers.c index bd00f0be774f11..97a85b26ef3f83 100644 --- a/ext/-test-/sanitizers/sanitizers.c +++ b/ext/-test-/sanitizers/sanitizers.c @@ -14,11 +14,23 @@ asan_enabled_p(VALUE self) #endif } +static VALUE +lsan_enabled_p(VALUE self) +{ +#if defined(__has_feature) + /* clang uses __has_feature for determining LSAN */ + return __has_feature(leak_sanitizer) ? Qtrue : Qfalse; +#else + return Qfalse; +#endif +} + void Init_sanitizers(void) { VALUE m = rb_define_module("Test"); VALUE c = rb_define_class_under(m, "Sanitizers", rb_cObject); rb_define_singleton_method(c, "asan_enabled?", asan_enabled_p, 0); + rb_define_singleton_method(c, "lsan_enabled?", lsan_enabled_p, 0); } From 42bbe9a075807fe578fd2680a7c64b80b7c2e24f Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 7 Oct 2025 21:04:13 -0400 Subject: [PATCH 6/6] Skip TestProcess#test_rlimit_nofile on LSAN --- test/ruby/test_process.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb index 7cea0b3a7027e7..3bbff73df8c070 100644 --- a/test/ruby/test_process.rb +++ b/test/ruby/test_process.rb @@ -58,6 +58,8 @@ def rlimit_exist? def test_rlimit_nofile return unless rlimit_exist? + omit "LSAN needs to open proc file" if Test::Sanitizers.lsan_enabled? + with_tmpchdir { File.write 's', <<-"End" # Too small RLIMIT_NOFILE, such as zero, causes problems.