diff --git a/.github/scripts/strategy-matrix/generate.py b/.github/scripts/strategy-matrix/generate.py index 9d0af78f22..0ebb388e4a 100755 --- a/.github/scripts/strategy-matrix/generate.py +++ b/.github/scripts/strategy-matrix/generate.py @@ -208,7 +208,7 @@ def addSanitizerConfigs(architecture: dict, os: dict, build_type: str, cmake_arg # before CMake processes it. This ensures the compiler receives an absolute path. # CMAKE_SOURCE_DIR won't work here because it's inside CMAKE_CXX_FLAGS string. # GCC doesn't support ignorelist. - cxx_flags += ' -fsanitize-ignorelist=$GITHUB_WORKSPACE/external/sanitizer-ignorelist.txt' + cxx_flags += ' -fsanitize-ignorelist=$GITHUB_WORKSPACE/sanitizers/suppressions/sanitizer-ignorelist.txt' sanitizers_flags = f'{sanitizers_flags},signed-integer-overflow,unsigned-integer-overflow' linker_flags += f' -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address,{sanitizers_flags}"' linker_flags += f' -DCMAKE_SHARED_LINKER_FLAGS="-fsanitize=address,{sanitizers_flags}"' diff --git a/.github/workflows/reusable-build-test-config.yml b/.github/workflows/reusable-build-test-config.yml index da3af85cd9..a2af717917 100644 --- a/.github/workflows/reusable-build-test-config.yml +++ b/.github/workflows/reusable-build-test-config.yml @@ -172,10 +172,10 @@ jobs: BUILD_TYPE: ${{ inputs.build_type }} PARALLELISM: ${{ runner.os == 'Windows' && '1' || steps.nproc.outputs.nproc }} run: | - export ASAN_OPTIONS="detect_container_overflow=0 suppressions=$GITHUB_WORKSPACE/external/asan.supp" - export TSAN_OPTIONS="second_deadlock_stack=1 halt_on_error=0 suppressions=$GITHUB_WORKSPACE/external/tsan.supp" - export UBSAN_OPTIONS="suppressions=$GITHUB_WORKSPACE/external/ubsan.supp" - export LSAN_OPTIONS="suppressions=$GITHUB_WORKSPACE/external/lsan.supp" + export ASAN_OPTIONS="detect_container_overflow=0 suppressions=$GITHUB_WORKSPACE/sanitizers/suppressions/asan.supp" + export TSAN_OPTIONS="second_deadlock_stack=1 halt_on_error=0 suppressions=$GITHUB_WORKSPACE/sanitizers/suppressions/tsan.supp" + export UBSAN_OPTIONS="suppressions=$GITHUB_WORKSPACE/sanitizers/suppressions/ubsan.supp" + export LSAN_OPTIONS="suppressions=$GITHUB_WORKSPACE/sanitizers/suppressions/lsan.supp" ctest \ --output-on-failure \ -C "${BUILD_TYPE}" \ @@ -187,10 +187,10 @@ jobs: env: BUILD_NPROC: ${{ steps.nproc.outputs.nproc }} run: | - export ASAN_OPTIONS="detect_container_overflow=0 suppressions=$GITHUB_WORKSPACE/external/asan.supp" - export TSAN_OPTIONS="second_deadlock_stack=1 halt_on_error=0 suppressions=$GITHUB_WORKSPACE/external/tsan.supp" - export UBSAN_OPTIONS="suppressions=$GITHUB_WORKSPACE/external/ubsan.supp" - export LSAN_OPTIONS="suppressions=$GITHUB_WORKSPACE/external/lsan.supp" + export ASAN_OPTIONS="detect_container_overflow=0 suppressions=$GITHUB_WORKSPACE/sanitizers/suppressions/asan.supp" + export TSAN_OPTIONS="second_deadlock_stack=1 halt_on_error=0 suppressions=$GITHUB_WORKSPACE/sanitizers/suppressions/tsan.supp" + export UBSAN_OPTIONS="suppressions=$GITHUB_WORKSPACE/sanitizers/suppressions/ubsan.supp" + export LSAN_OPTIONS="suppressions=$GITHUB_WORKSPACE/sanitizers/suppressions/lsan.supp" ./rippled --unittest --unittest-jobs "${BUILD_NPROC}" - name: Debug failure (Linux) diff --git a/conan/profiles/sanitizers b/conan/profiles/sanitizers index 0de436622c..d08861bb1b 100644 --- a/conan/profiles/sanitizers +++ b/conan/profiles/sanitizers @@ -38,7 +38,4 @@ tools.build:exelinkflags+=['{{tsan_sanitizer_flags}}'] {% endif %} -{% if sanitizers == "Address" or sanitizers == "Thread" %} -user.package:sanitizers={{ sanitizers }} -tools.info.package_id:confs+=["user.package:sanitizers", "tools.build:cxxflags", "tools.build:exelinkflags", "tools.build:sharedlinkflags"] -{% endif %} +tools.info.package_id:confs+=["tools.build:cxxflags", "tools.build:exelinkflags", "tools.build:sharedlinkflags"] diff --git a/docs/build/SANITIZERS_README.md b/docs/build/SANITIZERS_README.md index 158dc4c5ca..af5efb7994 100644 --- a/docs/build/SANITIZERS_README.md +++ b/docs/build/SANITIZERS_README.md @@ -1,7 +1,7 @@ # Sanitizer Configuration for Rippled This document explains how to properly configure and run sanitizers (AddressSanitizer, UndefinedBehaviorSanitizer, ThreadSanitizer) with the rippled project. -Corresponding suppression files are located in the `external` directory. +Corresponding suppression files are located in the `sanitizers/suppressions` directory. - [Sanitizer Configuration for Rippled](#sanitizer-configuration-for-rippled) - [Building with Sanitizers](#building-with-sanitizers) @@ -12,11 +12,11 @@ Corresponding suppression files are located in the `external` directory. - [ThreadSanitizer (TSan)](#threadsanitizer-tsan) - [LeakSanitizer (LSan)](#leaksanitizer-lsan) - [Suppression Files](#suppression-files) - - [external/asan.supp](#externalasansupp) - - [external/lsan.supp](#externallsansupp) - - [external/ubsan.supp](#externalubsansupp) - - [external/tsan.supp](#externaltsansupp) -- [Ignorelist](#externalsanitizer-ignorelisttxt) + - [asan.supp](#asansupp) + - [lsan.supp](#lsansupp) + - [ubsan.supp](#ubsansupp) + - [tsan.supp](#tsansupp) + - [Ignorelist](#sanitizer-ignorelisttxt) - [Known False Positives](#known-false-positives) - [References](#references) @@ -112,7 +112,7 @@ export ASAN_OPTIONS="detect_leaks=0" ## Suppression Files -### `external/asan.supp` +### `asan.supp` - **Purpose**: Suppress AddressSanitizer (ASan) errors only - **Format**: `interceptor_name:` where pattern matches file names. Supported suppression types are: @@ -123,25 +123,25 @@ export ASAN_OPTIONS="detect_leaks=0" - **More info**: [AddressSanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizer) - **Note**: Cannot suppress stack-buffer-overflow, container-overflow, etc. -### `external/lsan.supp` +### `lsan.supp` - **Purpose**: Suppress LeakSanitizer (LSan) errors only - **Format**: `leak:` where pattern matches function/file names - **More info**: [LeakSanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer) -### `external/ubsan.supp` +### `ubsan.supp` - **Purpose**: Suppress UndefinedBehaviorSanitizer errors - **Format**: `:` (e.g., `unsigned-integer-overflow:protobuf`) -- **Covers**: Intentional overflows in external libraries (protobuf, gRPC, stdlib) +- **Covers**: Intentional overflows in sanitizers/suppressions libraries (protobuf, gRPC, stdlib) -### `external/tsan.supp` +### `tsan.supp` - **Purpose**: Suppress ThreadSanitizer data race warnings - **Format**: `race:` where pattern matches function/file names - **More info**: [ThreadSanitizerSuppressions](https://github.com/google/sanitizers/wiki/ThreadSanitizerSuppressions) -### `external/sanitizer-ignorelist.txt` +### `sanitizer-ignorelist.txt` - **Purpose**: Compile-time ignorelist for all sanitizers - **Usage**: Passed via `-fsanitize-ignorelist=absolute/path/to/sanitizer-ignorelist.txt` diff --git a/external/asan.supp b/sanitizers/suppressions/asan.supp similarity index 85% rename from external/asan.supp rename to sanitizers/suppressions/asan.supp index a6c347f38b..2b44b52dc1 100644 --- a/external/asan.supp +++ b/sanitizers/suppressions/asan.supp @@ -1,6 +1,6 @@ # The idea is to empty this file gradually by fixing the underlying issues and removing suppresions. # -# ASAN_OPTIONS="detect_container_overflow=0:suppressions=external/asan.supp:halt_on_error=0" +# ASAN_OPTIONS="detect_container_overflow=0 suppressions=sanitizers/suppressions/asan.supp halt_on_error=0" # # The detect_container_overflow=0 option disables false positives from: # - Boost intrusive containers (slist_iterator.hpp, hashtable.hpp, aged_unordered_container.h) @@ -8,8 +8,8 @@ # # See: https://github.com/google/sanitizers/wiki/AddressSanitizerContainerOverflow -# Suprpress voilations in external code -interceptor_name:^external +# Suprpress voilations in sanitizers/suppressions code +interceptor_name:^sanitizers/suppressions # Boost interceptor_name:boost/asio diff --git a/external/lsan.supp b/sanitizers/suppressions/lsan.supp similarity index 100% rename from external/lsan.supp rename to sanitizers/suppressions/lsan.supp diff --git a/external/sanitizer-ignorelist.txt b/sanitizers/suppressions/sanitizer-ignorelist.txt similarity index 100% rename from external/sanitizer-ignorelist.txt rename to sanitizers/suppressions/sanitizer-ignorelist.txt diff --git a/external/tsan.supp b/sanitizers/suppressions/tsan.supp similarity index 100% rename from external/tsan.supp rename to sanitizers/suppressions/tsan.supp diff --git a/external/ubsan.supp b/sanitizers/suppressions/ubsan.supp similarity index 100% rename from external/ubsan.supp rename to sanitizers/suppressions/ubsan.supp