From db54e8546ce0fcbfd3b932df2eb62b4d87edf5af Mon Sep 17 00:00:00 2001 From: "rahul.singh" Date: Mon, 16 Feb 2026 05:03:05 +0100 Subject: [PATCH 1/4] Add sanitizer support using GCC toolchain features --- .bazelrc | 3 ++ .github/workflows/sanitizers.yml | 62 +++++++++++++++++++++++++++++ quality/sanitizer/sanitizer.bazelrc | 29 ++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 .github/workflows/sanitizers.yml create mode 100644 quality/sanitizer/sanitizer.bazelrc diff --git a/.bazelrc b/.bazelrc index 7bd1a8d..28e40d5 100644 --- a/.bazelrc +++ b/.bazelrc @@ -87,3 +87,6 @@ coverage --test_env=COVERAGE_GCOV_OPTIONS=-bcu coverage --test_env=LLVM_PROFILE_CONTINUOUS_MODE=1 coverage --cxxopt -mllvm coverage --cxxopt -runtime-counter-relocation + +# Dynamic analysis (sanitizers) for Linux host builds/tests. +try-import %workspace%/quality/sanitizer/sanitizer.bazelrc diff --git a/.github/workflows/sanitizers.yml b/.github/workflows/sanitizers.yml new file mode 100644 index 0000000..ed861b3 --- /dev/null +++ b/.github/workflows/sanitizers.yml @@ -0,0 +1,62 @@ +# ******************************************************************************* +# Copyright (c) 2026 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +name: Sanitizers + +on: + pull_request: + types: [opened, reopened, synchronize] + merge_group: + types: [checks_requested] + +permissions: + contents: read + +jobs: + sanitizer-tests: + name: Bazel Tests (${{ matrix.sanitizer_config }}) + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + sanitizer_config: [asan_ubsan_lsan, tsan] + + steps: + - name: Checkout repository + uses: actions/checkout@v4.2.2 + with: + ref: ${{ github.head_ref || github.event.pull_request.head.ref || github.ref }} + repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }} + + - name: Setup Bazel with shared caching + uses: bazel-contrib/setup-bazel@0.18.0 + with: + bazelisk-version: 1.26.0 + disk-cache: true + repository-cache: true + bazelisk-cache: true + cache-save: ${{ github.event_name == 'push' }} + + - name: Run sanitizer tests via Bazel + run: | + set -euo pipefail + echo "Running: bazel test --config=${{ matrix.sanitizer_config }} //score/... //tests/..." + bazel test --config=${{ matrix.sanitizer_config }} //score/... //tests/... + + - name: Upload Bazel test logs (always) + if: always() + uses: actions/upload-artifact@v6 + with: + name: bazel-testlogs-${{ matrix.sanitizer_config }} + path: bazel-testlogs/**/test.log + if-no-files-found: warn diff --git a/quality/sanitizer/sanitizer.bazelrc b/quality/sanitizer/sanitizer.bazelrc new file mode 100644 index 0000000..240e622 --- /dev/null +++ b/quality/sanitizer/sanitizer.bazelrc @@ -0,0 +1,29 @@ +# ******************************************************************************* +# Copyright (c) 2026 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +# ASan + UBSan + LSan +test:asan_ubsan_lsan --config=x86_64-linux +test:asan_ubsan_lsan --compilation_mode=dbg +test:asan_ubsan_lsan --features=asan +test:asan_ubsan_lsan --features=ubsan +test:asan_ubsan_lsan --features=lsan +test:asan_ubsan_lsan --platform_suffix=asan_ubsan_lsan +test:asan_ubsan_lsan --test_env=ASAN_OPTIONS=exitcode=55:allow_addr2line=1:verbosity=1:detect_leaks=1:halt_on_error=1:allocator_may_return_null=1 +test:asan_ubsan_lsan --test_env=UBSAN_OPTIONS=exitcode=55:allow_addr2line=1:verbosity=1:print_stacktrace=1:halt_on_error=1 + +# TSan +test:tsan --config=x86_64-linux +test:tsan --compilation_mode=dbg +test:tsan --features=tsan +test:tsan --platform_suffix=tsan +test:tsan --test_env=TSAN_OPTIONS=exitcode=55:allow_addr2line=1:verbosity=1:halt_on_error=1:detect_deadlocks=1 From f88cb8665e12d885266bf7619dc18afc016ff24d Mon Sep 17 00:00:00 2001 From: "rahul.singh" Date: Mon, 16 Feb 2026 15:15:39 +0100 Subject: [PATCH 2/4] Remove TSan from CI due to kernel compatibility issues --- .github/workflows/sanitizers.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/sanitizers.yml b/.github/workflows/sanitizers.yml index ed861b3..47f17e5 100644 --- a/.github/workflows/sanitizers.yml +++ b/.github/workflows/sanitizers.yml @@ -29,7 +29,7 @@ jobs: strategy: fail-fast: false matrix: - sanitizer_config: [asan_ubsan_lsan, tsan] + sanitizer_config: [asan_ubsan_lsan] steps: - name: Checkout repository @@ -50,8 +50,9 @@ jobs: - name: Run sanitizer tests via Bazel run: | set -euo pipefail - echo "Running: bazel test --config=${{ matrix.sanitizer_config }} //score/... //tests/..." - bazel test --config=${{ matrix.sanitizer_config }} //score/... //tests/... + echo "Running: bazel test --config=${{ matrix.sanitizer_config }} //tests/cpp/..." + # Note: Only testing C++ targets as Rust sanitizers require different configuration + bazel test --config=${{ matrix.sanitizer_config }} //tests/cpp/... - name: Upload Bazel test logs (always) if: always() From 1ba5d7ec62b89266a4c50d0dd2b278e6476208bc Mon Sep 17 00:00:00 2001 From: "rahul.singh" Date: Wed, 25 Feb 2026 11:33:10 +0100 Subject: [PATCH 3/4] Fix sanitizer workflow to test //score/... targets --- .github/workflows/sanitizers.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/sanitizers.yml b/.github/workflows/sanitizers.yml index 47f17e5..1083f39 100644 --- a/.github/workflows/sanitizers.yml +++ b/.github/workflows/sanitizers.yml @@ -50,9 +50,8 @@ jobs: - name: Run sanitizer tests via Bazel run: | set -euo pipefail - echo "Running: bazel test --config=${{ matrix.sanitizer_config }} //tests/cpp/..." - # Note: Only testing C++ targets as Rust sanitizers require different configuration - bazel test --config=${{ matrix.sanitizer_config }} //tests/cpp/... + echo "Running: bazel test --config=${{ matrix.sanitizer_config }} //score/..." + bazel test --config=${{ matrix.sanitizer_config }} //score/... - name: Upload Bazel test logs (always) if: always() From ce8a6f76e71de9c7d44a67d600a578a07f79f0e2 Mon Sep 17 00:00:00 2001 From: "rahul.singh" Date: Wed, 25 Feb 2026 12:34:42 +0100 Subject: [PATCH 4/4] Scope sanitizer workflow to C/C++ targets only Rust targets fail with C++ sanitizer flags due to linking incompatibilities --- .github/workflows/sanitizers.yml | 9 ++++++++- score/mw/log/rust/score_log_bridge/BUILD | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sanitizers.yml b/.github/workflows/sanitizers.yml index 1083f39..3bca6b2 100644 --- a/.github/workflows/sanitizers.yml +++ b/.github/workflows/sanitizers.yml @@ -51,7 +51,14 @@ jobs: run: | set -euo pipefail echo "Running: bazel test --config=${{ matrix.sanitizer_config }} //score/..." - bazel test --config=${{ matrix.sanitizer_config }} //score/... + # Note: Scoped to C/C++ targets only. Rust targets require Rust-specific + # sanitizer handling and are excluded via tag filters. + bazel test \ + --config=${{ matrix.sanitizer_config }} \ + //score/... \ + --build_tag_filters=-rust \ + --test_tag_filters=-rust \ + --verbose_failures - name: Upload Bazel test logs (always) if: always() diff --git a/score/mw/log/rust/score_log_bridge/BUILD b/score/mw/log/rust/score_log_bridge/BUILD index 45c6f1b..825365b 100644 --- a/score/mw/log/rust/score_log_bridge/BUILD +++ b/score/mw/log/rust/score_log_bridge/BUILD @@ -96,6 +96,7 @@ rust_test( edition = "2021", rustc_flags = RUSTC_FLAGS, tags = [ + "rust", "unit_tests", "ut", ], @@ -113,6 +114,7 @@ rust_binary( ], edition = "2021", rustc_flags = RUSTC_FLAGS, + tags = ["rust"], visibility = ["//visibility:public"], deps = [ ":score_log_bridge",