diff --git a/.circleci/config.yml b/.circleci/config.yml index 5fac13ba..397444b4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -24,6 +24,9 @@ jobs: tsan: type: boolean default: false + typesan: + type: boolean + default: false ubsan: type: boolean default: false @@ -127,6 +130,7 @@ jobs: readonly COMPILER=<< parameters.compiler >> readonly ASAN=<< parameters.asan >> readonly TSAN=<< parameters.tsan >> + readonly TYPESAN=<< parameters.typesan >> readonly UBSAN=<< parameters.ubsan >> if [[ $COMPILER == "gcc" ]]; then export CC=gcc-$GCC_VERSION @@ -148,8 +152,9 @@ jobs: fi cmake .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DSTANDALONE=ON \ -DMAINTAINER_MODE=ON -DSANITIZE_ADDRESS=$ASAN \ - -DSANITIZE_THREAD=$TSAN -DSANITIZE_UB=$UBSAN \ - -DCMAKE_CXX_FLAGS=-march=armv8.2-a "${EXTRA_CMAKE_ARGS[@]}" + -DSANITIZE_THREAD=$TSAN -DSANITIZE_TYPE=$TYPESAN \ + -DSANITIZE_UB=$UBSAN -DCMAKE_CXX_FLAGS=-march=armv8.2-a \ + "${EXTRA_CMAKE_ARGS[@]}" - run: name: Build working_directory: build diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b7cfd4c3..9c6b3fbd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,6 +11,7 @@ env: DEFAULT_COMPILER: gcc DEFAULT_SANITIZE_ADDRESS: OFF DEFAULT_SANITIZE_THREAD: OFF + DEFAULT_SANITIZE_TYPE: OFF DEFAULT_SANITIZE_UB: OFF DEFAULT_STATIC_ANALYSIS: OFF DEFAULT_COVERAGE: OFF @@ -26,6 +27,7 @@ jobs: BUILD_TYPE: ${{matrix.BUILD_TYPE}} SANITIZE_ADDRESS: ${{matrix.SANITIZE_ADDRESS}} SANITIZE_THREAD: ${{matrix.SANITIZE_THREAD}} + SANITIZE_TYPE: ${{matrix.SANITIZE_TYPE}} SANITIZE_UB: ${{matrix.SANITIZE_UB}} STATIC_ANALYSIS: ${{matrix.STATIC_ANALYSIS}} COVERAGE: ${{matrix.COVERAGE}} @@ -124,6 +126,12 @@ jobs: SANITIZE_UB: ON COMPILER: clang + - name: clang 20 Release with TypeSan + os: ubuntu-22.04 + BUILD_TYPE: Release + SANITIZE_TYPE: ON + COMPILER: clang + - name: clang 20 Debug os: ubuntu-22.04 BUILD_TYPE: Debug @@ -147,6 +155,12 @@ jobs: SANITIZE_UB: ON COMPILER: clang + - name: clang 20 Debug with TypeSan + os: ubuntu-22.04 + BUILD_TYPE: Debug + SANITIZE_TYPE: ON + COMPILER: clang + - name: clang 20 Release static analysis os: ubuntu-22.04 BUILD_TYPE: Release @@ -357,6 +371,7 @@ jobs: COMPILER="${COMPILER:-$DEFAULT_COMPILER}" SANITIZE_ADDRESS="${SANITIZE_ADDRESS:-$DEFAULT_SANITIZE_ADDRESS}" SANITIZE_THREAD="${SANITIZE_THREAD:-$DEFAULT_SANITIZE_THREAD}" + SANITIZE_TYPE="${SANITIZE_TYPE:-$DEFAULT_SANITIZE_TYPE}" SANITIZE_UB="${SANITIZE_UB:-$DEFAULT_SANITIZE_UB}" STATIC_ANALYSIS="${STATIC_ANALYSIS:-$DEFAULT_STATIC_ANALYSIS}" COVERAGE="${COVERAGE:-$DEFAULT_COVERAGE}" @@ -407,6 +422,7 @@ jobs: -DMAINTAINER_MODE=ON -DIWYU=ON \ "-DSANITIZE_ADDRESS=${SANITIZE_ADDRESS}" \ "-DSANITIZE_THREAD=${SANITIZE_THREAD}" \ + "-DSANITIZE_TYPE=${SANITIZE_TYPE}" \ "-DSANITIZE_UB=${SANITIZE_UB}" \ "-DSTATIC_ANALYSIS=${STATIC_ANALYSIS}" "-DCOVERAGE=${COVERAGE}" \ "-DAVX2=${AVX2}" "${EXTRA_CMAKE_ARGS[@]}" diff --git a/CMakeLists.txt b/CMakeLists.txt index 68acc800..76f9f0ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -278,6 +278,16 @@ if(SANITIZE_THREAD) list(APPEND SANITIZER_LD_FLAGS "-fsanitize=thread") endif() +option(SANITIZE_TYPE "Enable TypeSanitizer runtime checks") +if(SANITIZE_TYPE) + if(NOT is_clang OR CMAKE_CXX_COMPILER_VERSION VERSION_LESS 20.0) + message(FATAL_ERROR "Only clang >= 20 is compatible with TypeSanitizer") + endif() + set_common_sanitizer_flags() + list(APPEND SANITIZER_CXX_FLAGS "-fsanitize=type") + list(APPEND SANITIZER_LD_FLAGS "-fsanitize=type") +endif() + option(SANITIZE_UB "Enable UndefinedBehaviorSanitizer runtime checks") if(SANITIZE_UB) if(MSVC) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d326e026..f00a6448 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,6 +37,8 @@ There also other development-specific options. All of them are `OFF` by default. * `-DSANITIZE_THREAD=ON` to enable ThreadSanitizer (tsan). It is incompatible with the `-DSANITIZE_ADDRESS=ON` option, not available under MSVC, and will disable libfuzzer support if it would be enabled otherwise. +* `-DSANITIZE_TYPE=ON` to enable TypeSanitizer. Only available with clang + version 20 or later. * `-DSANITIZE_UB=ON` to enable UndefinedBehaviorSanitizer (ubsan). It is compatible with other sanitizer options, although some [false positive][sanitizer-combination-bug] might occur. Not available under MSVC.