From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from [87.239.111.99] (localhost [127.0.0.1]) by dev.tarantool.org (Postfix) with ESMTP id 026D96ECCC; Thu, 27 Aug 2026 15:07:17 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 026D96ECCC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tarantool.org; s=dev; t=1787832437; bh=QZCICrqBdF053Ow01OZ8xnFisquvpK3JReERza/XU64=; h=Date:To:Cc:References:In-Reply-To:Subject:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=WWWhtZcqcF71mZzzCSVLmGHtMd1/MQv8RB+MzspLUCZpXZ+aKy6+T9zLOuFmiDLMi 8sF/A6PzFOZxQ5izCytKcRnDYKtOQ2h4ppVTuWKHPwE/yPX7r58jaFseWhGxquJV0O PQ3iXDLXtVr0oHvwEDSBhe6rVwju95R9uCfogaWI= Received: from send173.i.mail.ru (send173.i.mail.ru [95.163.59.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 384DD6ECCC for ; Thu, 27 Aug 2026 15:07:16 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 384DD6ECCC Received: by exim-smtp-67896c5f6-g5r8h with esmtpa (envelope-from ) id 1wzYt0-00000000Cpm-40Iv; Thu, 27 Aug 2026 15:07:15 +0300 Content-Type: multipart/alternative; boundary="------------4Ll9pCL7lKV2ujEbovHlbR5s" Message-ID: <5798e367-3daa-4fe1-b9e0-5fec24d52082@tarantool.org> Date: Thu, 27 Aug 2026 15:07:13 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: Evgeniy Temirgaleev , Sergey Kaplun Cc: tarantool-patches@dev.tarantool.org References: <9d4e2c67dcc3640a917a649cfcd2f19253ddd2f1.1786019520.git.e.temirgaleev@tarantool.org> Content-Language: en-US In-Reply-To: <9d4e2c67dcc3640a917a649cfcd2f19253ddd2f1.1786019520.git.e.temirgaleev@tarantool.org> X-Mailru-Src: smtp X-4EC0790: 10 X-7564579A: B8F34718100C35BD X-77F55803: 4F1203BC0FB41BD989EAA21F98EB1A9343EBB72CA632A41128FC5E192B33BC3F182A05F538085040A121D25B090720633DE06ABAFEAF670550EC0BAAA81D52C71729DB3C8662528CC9EA2F84C7A79461 X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE7B4D64F1449264784EA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F7900637FE9EFE935CD7C6AE8638F802B75D45FF914D58D5BE9E6BC1A93B80C6DEB9DEE97C6FB206A91F05B276EC25BC05420B1B2E070BE324C7D3C4806174FB6961F5D1F6B57BC7E64490618DEB871D839B73339E8FC8737B5C224952D31B9D28593E51CC7F00164DA146DAFE8445B8C89999729449624AB7ADAF37F6B57BC7E64490611E7FA7ABCAF51C92176DF2183F8FC7C0ECC8AC47CD0EDEFF8941B15DA834481F9449624AB7ADAF372E808ACE2090B5E14AD6D5ED66289B5259CC434672EE63711DD303D21008E298D5E8D9A59859A8B6B372FE9A2E580EFC725E5C173C3A84C3045DD857D6FE754135872C767BF85DA2F004C90652538430E4A6367B16DE6309 X-C1DE0DAB: 0D63561A33F958A5C43EBB02466329585002B1117B3ED69694C4DF24892EB005CA7E60A991436CA2823CB91A9FED034534781492E4B8EEADD93757D16521BF51BDAD6C7F3747799A X-C8649E89: 1C3962B70DF3F0AD73CAD6646DEDE1918E10F71CB4DF9F96AB70F9BE574AE9C625B6776AC983F447FC0B9F89525902EE6F57B2FD27647F25E66C117BDB76D6596A5A521FB08C04EA1ED68838A7B22D317EA314A13DD51D315EF41944D14DE849FFF54BF3085CBDD6B8341EE9D5BE9A0A4BAACCEB50B1EF8FDB35570DE8C58174966A6D345A81F2CA6536EB022892E5344C41F94D744909CE2512F26BEC029E55448553D2254B8D95CD72808BE417F3B9E0E7457915DAA85F X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu53w8ahmwBjZKM/YPHZyZHvz5uv+WouB9+ObcCpyrx6l7KImUglyhkEat/+ysWwi0gdhEs0JGjl6ggRWTy1haxBpVdbIX1nthFXMZebaIdHP2ghjoIc/363UZI6Kf1ptIMVd9Ysz+d4RqWUJYsm/ALL9w= X-Mailru-Sender: 689FA8AB762F7393520AF17B8A65FDE2524CEDD48A30152306184D0CE97CE8A859734A3E0729F814EF86D5F70DA33880E41E8EF7A07863ECB274557F927329BE2DDF8182D28ACDB545BD1C3CC395C826B4A721A3011E896F X-Mras: Ok Subject: Re: [Tarantool-patches] [PATCH luajit v3 2/3] ci: enabled sanitizer tests for macOS X-BeenThere: tarantool-patches@dev.tarantool.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Sergey Bronnikov via Tarantool-patches Reply-To: Sergey Bronnikov Errors-To: tarantool-patches-bounces@dev.tarantool.org Sender: "Tarantool-patches" This is a multi-part message in MIME format. --------------4Ll9pCL7lKV2ujEbovHlbR5s Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi, Evgeniy, thanks for the patch! See my comments below. Sergey On 8/6/26 15:47, Evgeniy Temirgaleev wrote: > From: Temir Galeev > > The arm64 and x86_64 architectures with clang/gcc compiler were added > to the matrix. > --- > .../README.md | 0 > .../action.yml | 8 +- > .../actions/setup-sanitizers-macos/README.md | 15 +++ > .../actions/setup-sanitizers-macos/action.yml | 73 +++++++++++++ > .github/workflows/sanitizers-testing.yml | 101 ++++++++++++++++-- > 5 files changed, 186 insertions(+), 11 deletions(-) > rename .github/actions/{setup-sanitizers => setup-sanitizers-linux}/README.md (100%) > rename .github/actions/{setup-sanitizers => setup-sanitizers-linux}/action.yml (76%) > create mode 100644 .github/actions/setup-sanitizers-macos/README.md > create mode 100644 .github/actions/setup-sanitizers-macos/action.yml > > diff --git a/.github/actions/setup-sanitizers/README.md b/.github/actions/setup-sanitizers-linux/README.md > similarity index 100% > rename from .github/actions/setup-sanitizers/README.md > rename to .github/actions/setup-sanitizers-linux/README.md > diff --git a/.github/actions/setup-sanitizers/action.yml b/.github/actions/setup-sanitizers-linux/action.yml > similarity index 76% > rename from .github/actions/setup-sanitizers/action.yml > rename to .github/actions/setup-sanitizers-linux/action.yml > index 8642d553..18f5a75d 100644 > --- a/.github/actions/setup-sanitizers/action.yml > +++ b/.github/actions/setup-sanitizers-linux/action.yml > @@ -20,13 +20,17 @@ runs: > - name: Install build and test dependencies > run: | > apt -y update > + echo Available compilers: > + export CC_FAMILY=`echo ${CC_NAME} | sed 's/-.*$//'` > + apt list | grep -Pe "^${CC_FAMILY}-[0-9]+/" > + # Try to install Honestly, I don't get why we should available compilers on each run. Why we cannot hardcode compiler here? > apt -y install ${CC_NAME} libstdc++-10-dev cmake ninja-build make perl > shell: bash > env: > CC_NAME: ${{ inputs.cc_name }} > - - name: Set specific C compiler as a default toolchain > + - name: Set specific C compiler as a default toolchain for cmake s/cmake/CMake/? > run: | > - echo CC=${CC_NAME} | tee -a $GITHUB_ENV > + echo CMAKE_C_COMPILER=${CC_NAME} | tee -a $GITHUB_ENV s/tee -a/>>/ (feel free to ignore, previously tee was used) > shell: bash > env: > CC_NAME: ${{ inputs.cc_name }} > diff --git a/.github/actions/setup-sanitizers-macos/README.md b/.github/actions/setup-sanitizers-macos/README.md > new file mode 100644 > index 00000000..9ac5eb38 > --- /dev/null > +++ b/.github/actions/setup-sanitizers-macos/README.md > @@ -0,0 +1,15 @@ > +# Setup environment for sanitizers on macOS > + > +Action setups the environment on macOS runners (install requirements, setup the > +workflow environment, etc) for testing with sanitizers enabled. > + > +Requires input: > +- cc_name as versioned C compiler: gcc-ver or clang-ver. > + > +## How to use Github Action from Github workflow > + > +Add the following code to the running steps before LuaJIT configuration: > +``` > +- uses: ./.github/actions/setup-sanitizers-macos > + if: ${{ matrix.OS == 'macOS' }} > +``` > diff --git a/.github/actions/setup-sanitizers-macos/action.yml b/.github/actions/setup-sanitizers-macos/action.yml > new file mode 100644 > index 00000000..9836ea03 > --- /dev/null > +++ b/.github/actions/setup-sanitizers-macos/action.yml > @@ -0,0 +1,73 @@ > +name: Setup CI environment for testing with sanitizers on macOS > +description: Common part to tweak macOS CI runner environment for sanitizers > +inputs: > + cc_name: > + description: C compiler name (for example, gcc-12) > + required: false > + default: clang-21 > +runs: > + using: composite > + steps: > + - name: Get compiler version from cc_name > + shell: bash > + env: > + CC_NAME: ${{ inputs.cc_name }} > + run: | > + echo CC_VERSION=`echo ${CC_NAME} | sed 's/.*-//'` | tee -a $GITHUB_ENV > + - name: Get brew formula from cc_name > + shell: bash > + env: > + CC_FORMULA_NAME: |- > + ${{ case( > + startsWith(inputs.cc_name, 'gcc'), 'gcc', > + startsWith(inputs.cc_name, 'clang'), 'llvm', > + 'MISCONFIG' > + ) }} > + run: | > + echo CC_FORMULA=${CC_FORMULA_NAME}@${CC_VERSION} | tee -a $GITHUB_ENV > + echo Available formulas: `brew search ${CC_FORMULA_NAME}` > + - name: Setup CI environment > + uses: ./.github/actions/setup > + - name: Set CMAKE_BUILD_PARALLEL_LEVEL > + shell: bash > + run: | > + # Set CMAKE_BUILD_PARALLEL_LEVEL environment variable to > + # limit the number of parallel jobs for build/test step. > + NPROC=$(sysctl -n hw.logicalcpu 2>/dev/null) > + echo CMAKE_BUILD_PARALLEL_LEVEL=$(($NPROC + 1)) | tee -a $GITHUB_ENV > + - name: Set MACOSX_DEPLOYMENT_TARGERT > + shell: bash > + run: | > + # Set required MACOSX_DEPLOYMENT_TARGERT environment > + # variable for Makefile.original build. > + # Seehttps://github.com/LuaJIT/LuaJIT/issues/484, > + #https://github.com/LuaJIT/LuaJIT/issues/653. > + echo MACOSX_DEPLOYMENT_TARGET=$(sw_vers -productVersion) | tee -a $GITHUB_ENV > + - name: Install build and test dependencies > + shell: bash > + run: | > + # Install brew using the command from Homebrew repository > + # instructions:https://github.com/Homebrew/install. > + # XXX: 'echo' command below is required since brew > + # installation script obliges the one to enter a newline > + # for confirming the installation via Ruby script. > + brew update || > + echo | /usr/bin/ruby -e "$(curl -fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)" > + # Try to install the packages either upgrade it to avoid > + # of fails if the package already exists with the previous > + # version. > + brew install --force ${CC_FORMULA} cmake make ninja perl || > + brew upgrade ${CC_FORMULA} cmake make ninja perl > + - name: Set specific C compiler as a default toolchain for cmake > + shell: bash > + env: > + CC_NAME: ${{ inputs.cc_name }} > + run: | > + echo CMAKE_C_COMPILER=${CC_NAME} | tee -a $GITHUB_ENV > + echo CMAKE_PREFIX_PATH="`brew --prefix ${CC_FORMULA}`" | tee -a $GITHUB_ENV > + - name: Log installed compilers > + shell: bash > + run: | > + echo default clang: `clang --version` > + echo default gcc: `gcc --version` > + echo cmake compiler: `${CMAKE_PREFIX_PATH}/bin/${CMAKE_C_COMPILER} --version` > diff --git a/.github/workflows/sanitizers-testing.yml b/.github/workflows/sanitizers-testing.yml > index 4bf7d023..fe550b81 100644 > --- a/.github/workflows/sanitizers-testing.yml > +++ b/.github/workflows/sanitizers-testing.yml > @@ -31,17 +31,41 @@ jobs: > strategy: > fail-fast: false > matrix: > - # XXX: Let's start with only Linux/x86_64 > + ARCH: [ARM64, x86_64] > BUILDTYPE: [Debug, Release] > - CC: [gcc-10, clang-11] > + OS: [Linux, macOS] > + # There are different top-level versions available for Linux and macOS runners. > + CC: [gcc-10, clang-11, gcc-15, clang-21] > include: > - BUILDTYPE: Debug > CMAKEFLAGS: -DCMAKE_BUILD_TYPE=Debug -DLUA_USE_ASSERT=ON -DLUA_USE_APICHECK=ON > - BUILDTYPE: Release > CMAKEFLAGS: -DCMAKE_BUILD_TYPE=RelWithDebInfo > - runs-on: [self-hosted, regular, Linux, x86_64] > + exclude: > + # On current runners with Linux/ARM64 environment and > + # with LUAJIT_USE_SYSMALLOC=ON the system allocator returns addresses > + # with 48-bit set. Thus checkptrGC() fails with new Lua state pointer > + # and luajit fails to start with 'cannot create state: not enough memory' > + # error. So, we exclude these cases. > + - ARCH: ARM64 > + OS: Linux > + # Exclude nonsuitable OS/compiler pairs. > + - OS: macOS > + CC: gcc-10 > + - OS: macOS > + CC: clang-11 > + - OS: Linux > + CC: gcc-15 > + - OS: Linux > + CC: clang-21 > + # Exclude macOS/ARM64/gcc case due to some tests are failed. > + # Details:https://github.com/tarantool/tarantool/issues/13018 > + - ARCH: ARM64 > + OS: macOS > + CC: gcc-15 > + runs-on: [self-hosted, regular, '${{ matrix.OS }}', '${{ matrix.ARCH }}'] > name: > > - LuaJIT with ASan and UBSan (Linux/x86_64) > + LuaJIT with ASan and UBSan (${{ matrix.OS }}/${{ matrix.ARCH }}) > ${{ matrix.BUILDTYPE }} > CC:${{ matrix.CC }} > GC64:ON SYSMALLOC:ON > @@ -51,7 +75,13 @@ jobs: > fetch-depth: 0 > submodules: recursive > - name: setup Linux for sanitizers > - uses: ./.github/actions/setup-sanitizers > + if: ${{ matrix.OS == 'Linux' }} > + uses: ./.github/actions/setup-sanitizers-linux > + with: > + cc_name: ${{ matrix.CC }} > + - name: setup macOS for sanitizers > + if: ${{ matrix.OS == 'macOS' }} > + uses: ./.github/actions/setup-sanitizers-macos > with: > cc_name: ${{ matrix.CC }} > - name: configure > @@ -70,18 +100,46 @@ jobs: > cmake -S . -B ${{ env.BUILDDIR }} > -G Ninja > ${{ matrix.CMAKEFLAGS }} > + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} > + -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} > -DLUAJIT_ENABLE_GC64=ON > -DLUAJIT_USE_ASAN=ON > -DLUAJIT_USE_SYSMALLOC=ON > -DLUAJIT_USE_UBSAN=ON > + - name: Check for possible compiler misconfig > + working-directory: ${{ env.BUILDDIR }} > + env: > + CC_NAME: ${{ matrix.CC }} > + run: grep CMakeCache.txt -e CMAKE_C_COMPILER:STRING | grep ${CC_NAME} > - name: build > run: cmake --build . --parallel > working-directory: ${{ env.BUILDDIR }} > - - name: test > + > + # Enable as much checks as possible. See more info here: You say about enabling ASAN features, but some features are disabled below, please explain why these features are disabled. > + #https://github.com/google/sanitizers/wiki/AddressSanitizerFlags, > + #https://github.com/google/sanitizers/wiki/SanitizerCommonFlags. > + - name: setup sanitizer options for Linux > + if: ${{ matrix.OS == 'Linux' }} > + env: > + ASAN_OPTIONS: " \ > + detect_invalid_pointer_pairs=1: \ > + detect_leaks=1: \ already enabled by default > + detect_stack_use_after_return=1: \ > + dump_instruction_bytes=1: \ > + heap_profile=0: \ disabled by default > + print_suppressions=0: \ Why disabled? > + symbolize=1: \ enabled by default > + unmap_shadow_on_exit=1: \ > + " > + UBSAN_OPTIONS: " > + print_stacktrace=1 \ > + " > + run: | > + echo ASAN_OPTIONS=${ASAN_OPTIONS} | tee -a $GITHUB_ENV > + echo UBSAN_OPTIONS=${UBSAN_OPTIONS} | tee -a $GITHUB_ENV s/tee -a/>>/ (the same thing but usually used in Github documentation) > + - name: setup sanitizer options for macOS (common) > + if: ${{ matrix.OS == 'macOS' && matrix.ARCH != 'ARM64' && matrix.CC != 'clang-21' }} > env: > - # Enable as much checks as possible. See more info here: > - #https://github.com/google/sanitizers/wiki/AddressSanitizerFlags, > - #https://github.com/google/sanitizers/wiki/SanitizerCommonFlags. > ASAN_OPTIONS: " \ > detect_invalid_pointer_pairs=1: \ > detect_leaks=1: \ > @@ -95,5 +153,30 @@ jobs: > UBSAN_OPTIONS: " > print_stacktrace=1 \ > " > + run: | > + echo ASAN_OPTIONS=${ASAN_OPTIONS} | tee -a $GITHUB_ENV > + echo UBSAN_OPTIONS=${UBSAN_OPTIONS} | tee -a $GITHUB_ENV s/tee -a/>>/ > + - name: setup sanitizer options for macOS (ARM64/clang-21) > + if: ${{ matrix.OS == 'macOS' && matrix.ARCH == 'ARM64' && matrix.CC == 'clang-21' }} > + # detect_leaks is disabled due to some tests build is failed. > + # Details:https://github.com/tarantool/tarantool/issues/13019 > + env: > + ASAN_OPTIONS: " \ > + detect_invalid_pointer_pairs=1: \ > + detect_leaks=0: \ > + detect_stack_use_after_return=1: \ > + dump_instruction_bytes=1: \ > + heap_profile=0: \ > + print_suppressions=0: \ > + symbolize=1: \ > + unmap_shadow_on_exit=1: \ the same questions as above. Also, can we avoid duplication? > + " > + UBSAN_OPTIONS: " > + print_stacktrace=1 \ > + " > + run: | > + echo ASAN_OPTIONS=${ASAN_OPTIONS} | tee -a $GITHUB_ENV > + echo UBSAN_OPTIONS=${UBSAN_OPTIONS} | tee -a $GITHUB_ENV s/tee -a/>>/ > + - name: test > run: cmake --build . --parallel --target LuaJIT-test > working-directory: ${{ env.BUILDDIR }} --------------4Ll9pCL7lKV2ujEbovHlbR5s Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Hi, Evgeniy,

thanks for the patch! See my comments below.

Sergey

On 8/6/26 15:47, Evgeniy Temirgaleev wrote:
From: Temir Galeev <temir.galeev@bk.ru>

The arm64 and x86_64 architectures with clang/gcc compiler were added
to the matrix.
---
 .../README.md                                 |   0
 .../action.yml                                |   8 +-
 .../actions/setup-sanitizers-macos/README.md  |  15 +++
 .../actions/setup-sanitizers-macos/action.yml |  73 +++++++++++++
 .github/workflows/sanitizers-testing.yml      | 101 ++++++++++++++++--
 5 files changed, 186 insertions(+), 11 deletions(-)
 rename .github/actions/{setup-sanitizers => setup-sanitizers-linux}/README.md (100%)
 rename .github/actions/{setup-sanitizers => setup-sanitizers-linux}/action.yml (76%)
 create mode 100644 .github/actions/setup-sanitizers-macos/README.md
 create mode 100644 .github/actions/setup-sanitizers-macos/action.yml

diff --git a/.github/actions/setup-sanitizers/README.md b/.github/actions/setup-sanitizers-linux/README.md
similarity index 100%
rename from .github/actions/setup-sanitizers/README.md
rename to .github/actions/setup-sanitizers-linux/README.md
diff --git a/.github/actions/setup-sanitizers/action.yml b/.github/actions/setup-sanitizers-linux/action.yml
similarity index 76%
rename from .github/actions/setup-sanitizers/action.yml
rename to .github/actions/setup-sanitizers-linux/action.yml
index 8642d553..18f5a75d 100644
--- a/.github/actions/setup-sanitizers/action.yml
+++ b/.github/actions/setup-sanitizers-linux/action.yml
@@ -20,13 +20,17 @@ runs:
     - name: Install build and test dependencies
       run: |
         apt -y update
+        echo Available compilers:
+        export CC_FAMILY=`echo ${CC_NAME} | sed 's/-.*$//'`
+        apt list | grep -Pe "^${CC_FAMILY}-[0-9]+/"
+        # Try to install

Honestly, I don't get why we should available compilers on each run. Why we cannot

hardcode compiler here?

         apt -y install ${CC_NAME} libstdc++-10-dev cmake ninja-build make perl
       shell: bash
       env:
         CC_NAME: ${{ inputs.cc_name }}
-    - name: Set specific C compiler as a default toolchain
+    - name: Set specific C compiler as a default toolchain for cmake
s/cmake/CMake/?
       run: |
-        echo CC=${CC_NAME} | tee -a $GITHUB_ENV
+        echo CMAKE_C_COMPILER=${CC_NAME} | tee -a $GITHUB_ENV
s/tee -a/>>/ (feel free to ignore, previously tee was used)
       shell: bash
       env:
         CC_NAME: ${{ inputs.cc_name }}
diff --git a/.github/actions/setup-sanitizers-macos/README.md b/.github/actions/setup-sanitizers-macos/README.md
new file mode 100644
index 00000000..9ac5eb38
--- /dev/null
+++ b/.github/actions/setup-sanitizers-macos/README.md
@@ -0,0 +1,15 @@
+# Setup environment for sanitizers on macOS
+
+Action setups the environment on macOS runners (install requirements, setup the
+workflow environment, etc) for testing with sanitizers enabled.
+
+Requires input:
+- cc_name as versioned C compiler: gcc-ver or clang-ver.
+
+## How to use Github Action from Github workflow
+
+Add the following code to the running steps before LuaJIT configuration:
+```
+- uses: ./.github/actions/setup-sanitizers-macos
+  if: ${{ matrix.OS == 'macOS' }}
+```
diff --git a/.github/actions/setup-sanitizers-macos/action.yml b/.github/actions/setup-sanitizers-macos/action.yml
new file mode 100644
index 00000000..9836ea03
--- /dev/null
+++ b/.github/actions/setup-sanitizers-macos/action.yml
@@ -0,0 +1,73 @@
+name: Setup CI environment for testing with sanitizers on macOS
+description: Common part to tweak macOS CI runner environment for sanitizers
+inputs:
+  cc_name:
+    description: C compiler name (for example, gcc-12)
+    required: false
+    default: clang-21
+runs:
+  using: composite
+  steps:
+    - name: Get compiler version from cc_name
+      shell: bash
+      env:
+        CC_NAME: ${{ inputs.cc_name }}
+      run: |
+        echo CC_VERSION=`echo ${CC_NAME} | sed 's/.*-//'` | tee -a $GITHUB_ENV
+    - name: Get brew formula from cc_name
+      shell: bash
+      env:
+        CC_FORMULA_NAME: |-
+          ${{ case(
+            startsWith(inputs.cc_name, 'gcc'), 'gcc',
+            startsWith(inputs.cc_name, 'clang'), 'llvm',
+            'MISCONFIG'
+          ) }}
+      run: |
+        echo CC_FORMULA=${CC_FORMULA_NAME}@${CC_VERSION} | tee -a $GITHUB_ENV
+        echo Available formulas: `brew search ${CC_FORMULA_NAME}`
+    - name: Setup CI environment
+      uses: ./.github/actions/setup
+    - name: Set CMAKE_BUILD_PARALLEL_LEVEL
+      shell: bash
+      run: |
+        # Set CMAKE_BUILD_PARALLEL_LEVEL environment variable to
+        # limit the number of parallel jobs for build/test step.
+        NPROC=$(sysctl -n hw.logicalcpu 2>/dev/null)
+        echo CMAKE_BUILD_PARALLEL_LEVEL=$(($NPROC + 1)) | tee -a $GITHUB_ENV
+    - name: Set MACOSX_DEPLOYMENT_TARGERT
+      shell: bash
+      run: |
+        # Set required MACOSX_DEPLOYMENT_TARGERT environment
+        # variable for Makefile.original build.
+        # See https://github.com/LuaJIT/LuaJIT/issues/484,
+        # https://github.com/LuaJIT/LuaJIT/issues/653.
+        echo MACOSX_DEPLOYMENT_TARGET=$(sw_vers -productVersion) | tee -a $GITHUB_ENV
+    - name: Install build and test dependencies
+      shell: bash
+      run: |
+        # Install brew using the command from Homebrew repository
+        # instructions: https://github.com/Homebrew/install.
+        # XXX: 'echo' command below is required since brew
+        # installation script obliges the one to enter a newline
+        # for confirming the installation via Ruby script.
+        brew update ||
+          echo | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
+        # Try to install the packages either upgrade it to avoid
+        # of fails if the package already exists with the previous
+        # version.
+        brew install --force ${CC_FORMULA} cmake make ninja perl ||
+          brew upgrade ${CC_FORMULA} cmake make ninja perl
+    - name: Set specific C compiler as a default toolchain for cmake
+      shell: bash
+      env:
+        CC_NAME: ${{ inputs.cc_name }}
+      run: |
+        echo CMAKE_C_COMPILER=${CC_NAME} | tee -a $GITHUB_ENV
+        echo CMAKE_PREFIX_PATH="`brew --prefix ${CC_FORMULA}`" | tee -a $GITHUB_ENV
+    - name: Log installed compilers
+      shell: bash
+      run: |
+        echo default clang: `clang --version`
+        echo default gcc: `gcc --version`
+        echo cmake compiler: `${CMAKE_PREFIX_PATH}/bin/${CMAKE_C_COMPILER} --version`
diff --git a/.github/workflows/sanitizers-testing.yml b/.github/workflows/sanitizers-testing.yml
index 4bf7d023..fe550b81 100644
--- a/.github/workflows/sanitizers-testing.yml
+++ b/.github/workflows/sanitizers-testing.yml
@@ -31,17 +31,41 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        # XXX: Let's start with only Linux/x86_64
+        ARCH: [ARM64, x86_64]
         BUILDTYPE: [Debug, Release]
-        CC: [gcc-10, clang-11]
+        OS: [Linux, macOS]
+        # There are different top-level versions available for Linux and macOS runners.
+        CC: [gcc-10, clang-11, gcc-15, clang-21]
         include:
           - BUILDTYPE: Debug
             CMAKEFLAGS: -DCMAKE_BUILD_TYPE=Debug -DLUA_USE_ASSERT=ON -DLUA_USE_APICHECK=ON
           - BUILDTYPE: Release
             CMAKEFLAGS: -DCMAKE_BUILD_TYPE=RelWithDebInfo
-    runs-on: [self-hosted, regular, Linux, x86_64]
+        exclude:
+          # On current runners with Linux/ARM64 environment and
+          # with LUAJIT_USE_SYSMALLOC=ON the system allocator returns addresses
+          # with 48-bit set. Thus checkptrGC() fails with new Lua state pointer
+          # and luajit fails to start with 'cannot create state: not enough memory'
+          # error. So, we exclude these cases.
+          - ARCH: ARM64
+            OS: Linux
+          # Exclude nonsuitable OS/compiler pairs.
+          - OS: macOS
+            CC: gcc-10
+          - OS: macOS
+            CC: clang-11
+          - OS: Linux
+            CC: gcc-15
+          - OS: Linux
+            CC: clang-21
+          # Exclude macOS/ARM64/gcc case due to some tests are failed.
+          # Details: https://github.com/tarantool/tarantool/issues/13018
+          - ARCH: ARM64
+            OS: macOS
+            CC: gcc-15
+    runs-on: [self-hosted, regular, '${{ matrix.OS }}', '${{ matrix.ARCH }}']
     name: >
-      LuaJIT with ASan and UBSan (Linux/x86_64)
+      LuaJIT with ASan and UBSan (${{ matrix.OS }}/${{ matrix.ARCH }})
       ${{ matrix.BUILDTYPE }}
       CC:${{ matrix.CC }}
       GC64:ON SYSMALLOC:ON
@@ -51,7 +75,13 @@ jobs:
           fetch-depth: 0
           submodules: recursive
       - name: setup Linux for sanitizers
-        uses: ./.github/actions/setup-sanitizers
+        if: ${{ matrix.OS == 'Linux' }}
+        uses: ./.github/actions/setup-sanitizers-linux
+        with:
+          cc_name: ${{ matrix.CC }}
+      - name: setup macOS for sanitizers
+        if: ${{ matrix.OS == 'macOS' }}
+        uses: ./.github/actions/setup-sanitizers-macos
         with:
           cc_name: ${{ matrix.CC }}
       - name: configure
@@ -70,18 +100,46 @@ jobs:
           cmake -S . -B ${{ env.BUILDDIR }}
           -G Ninja
           ${{ matrix.CMAKEFLAGS }}
+          -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+          -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
           -DLUAJIT_ENABLE_GC64=ON
           -DLUAJIT_USE_ASAN=ON
           -DLUAJIT_USE_SYSMALLOC=ON
           -DLUAJIT_USE_UBSAN=ON
+      - name: Check for possible compiler misconfig
+        working-directory: ${{ env.BUILDDIR }}
+        env:
+          CC_NAME: ${{ matrix.CC }}
+        run: grep CMakeCache.txt -e CMAKE_C_COMPILER:STRING | grep ${CC_NAME}
       - name: build
         run: cmake --build . --parallel
         working-directory: ${{ env.BUILDDIR }}
-      - name: test
+
+      # Enable as much checks as possible. See more info here:

You say about enabling ASAN features, but some features are disabled below,

please explain why these features are disabled.

+      # https://github.com/google/sanitizers/wiki/AddressSanitizerFlags,
+      # https://github.com/google/sanitizers/wiki/SanitizerCommonFlags.
+      - name: setup sanitizer options for Linux
+        if: ${{ matrix.OS == 'Linux' }}
+        env:
+          ASAN_OPTIONS: "                    \
+            detect_invalid_pointer_pairs=1:  \
+            detect_leaks=1:                  \
already enabled by default
+            detect_stack_use_after_return=1: \
+            dump_instruction_bytes=1:        \
+            heap_profile=0:                  \
disabled by default
+            print_suppressions=0:            \
Why disabled?
+            symbolize=1:                     \
enabled by default
+            unmap_shadow_on_exit=1:          \
+          "
+          UBSAN_OPTIONS: "
+            print_stacktrace=1 \
+          "
+        run: |
+          echo ASAN_OPTIONS=${ASAN_OPTIONS} | tee -a $GITHUB_ENV
+          echo UBSAN_OPTIONS=${UBSAN_OPTIONS} | tee -a $GITHUB_ENV
s/tee -a/>>/ (the same thing but usually used in Github documentation)
+      - name: setup sanitizer options for macOS (common)
+        if: ${{ matrix.OS == 'macOS' && matrix.ARCH != 'ARM64' && matrix.CC != 'clang-21' }}
         env:
-          # Enable as much checks as possible. See more info here:
-          # https://github.com/google/sanitizers/wiki/AddressSanitizerFlags,
-          # https://github.com/google/sanitizers/wiki/SanitizerCommonFlags.
           ASAN_OPTIONS: "                    \
             detect_invalid_pointer_pairs=1:  \
             detect_leaks=1:                  \
@@ -95,5 +153,30 @@ jobs:
           UBSAN_OPTIONS: "
             print_stacktrace=1 \
           "
+        run: |
+          echo ASAN_OPTIONS=${ASAN_OPTIONS} | tee -a $GITHUB_ENV
+          echo UBSAN_OPTIONS=${UBSAN_OPTIONS} | tee -a $GITHUB_ENV
s/tee -a/>>/
+      - name: setup sanitizer options for macOS (ARM64/clang-21)
+        if: ${{ matrix.OS == 'macOS' && matrix.ARCH == 'ARM64' && matrix.CC == 'clang-21' }}
+        # detect_leaks is disabled due to some tests build is failed.
+        # Details: https://github.com/tarantool/tarantool/issues/13019
+        env:
+          ASAN_OPTIONS: "                    \
+            detect_invalid_pointer_pairs=1:  \
+            detect_leaks=0:                  \
+            detect_stack_use_after_return=1: \
+            dump_instruction_bytes=1:        \
+            heap_profile=0:                  \
+            print_suppressions=0:            \
+            symbolize=1:                     \
+            unmap_shadow_on_exit=1:          \
the same questions as above. Also, can we avoid duplication?
+          "
+          UBSAN_OPTIONS: "
+            print_stacktrace=1 \
+          "
+        run: |
+          echo ASAN_OPTIONS=${ASAN_OPTIONS} | tee -a $GITHUB_ENV
+          echo UBSAN_OPTIONS=${UBSAN_OPTIONS} | tee -a $GITHUB_ENV
s/tee -a/>>/
+      - name: test
         run: cmake --build . --parallel --target LuaJIT-test
         working-directory: ${{ env.BUILDDIR }}
--------------4Ll9pCL7lKV2ujEbovHlbR5s--