diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a86ea0f7..72da96e1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -403,6 +403,7 @@ jobs: export CC=clang export CXX=clang++ fi + set +e cmake -B build "$GITHUB_WORKSPACE" "$CBT" -DSTANDALONE=ON \ -DMAINTAINER_MODE=ON -DIWYU=ON \ "-DSANITIZE_ADDRESS=${SANITIZE_ADDRESS}" \ @@ -410,6 +411,16 @@ jobs: "-DSANITIZE_UB=${SANITIZE_UB}" \ "-DSTATIC_ANALYSIS=${STATIC_ANALYSIS}" "-DCOVERAGE=${COVERAGE}" \ "-DAVX2=${AVX2}" "${EXTRA_CMAKE_ARGS[@]}" + CMAKE_EXIT_CODE=$? + set -e + if [ $CMAKE_EXIT_CODE -ne 0 ]; then + if [ -f build/CMakeFiles/CMakeConfigureLog.yaml ]; then + echo "::group::CMakeConfigureLog.yaml" + cat build/CMakeFiles/CMakeConfigureLog.yaml + echo "::endgroup::" + fi + exit $CMAKE_EXIT_CODE + fi - name: Build working-directory: ${{github.workspace}}/build diff --git a/.github/workflows/old-compilers.yml b/.github/workflows/old-compilers.yml index b52d7c26..4cfacf53 100644 --- a/.github/workflows/old-compilers.yml +++ b/.github/workflows/old-compilers.yml @@ -35,6 +35,98 @@ jobs: fail-fast: false matrix: include: + - name: clang 11 Release + BUILD_TYPE: Release + COMPILER: clang + VERSION: 11 + + - name: clang 11 Release with ASan + BUILD_TYPE: Release + SANITIZE_ADDRESS: ON + COMPILER: clang + VERSION: 11 + + - name: clang 11 Release with TSan + BUILD_TYPE: Release + SANITIZE_THREAD: ON + COMPILER: clang + VERSION: 11 + + - name: clang 11 Release with UBSan + BUILD_TYPE: Release + SANITIZE_UB: ON + COMPILER: clang + VERSION: 11 + + - name: clang 11 Debug + BUILD_TYPE: Debug + COMPILER: clang + VERSION: 11 + + - name: clang 11 Debug with ASan + BUILD_TYPE: Debug + SANITIZE_ADDRESS: ON + COMPILER: clang + VERSION: 11 + + - name: clang 11 Debug with TSan + BUILD_TYPE: Debug + SANITIZE_THREAD: ON + COMPILER: clang + VERSION: 11 + + - name: clang 11 Debug with UBSan + BUILD_TYPE: Debug + SANITIZE_UB: ON + COMPILER: clang + VERSION: 11 + + - name: clang 12 Release + BUILD_TYPE: Release + COMPILER: clang + VERSION: 12 + + - name: clang 12 Release with ASan + BUILD_TYPE: Release + SANITIZE_ADDRESS: ON + COMPILER: clang + VERSION: 12 + + - name: clang 12 Release with TSan + BUILD_TYPE: Release + SANITIZE_THREAD: ON + COMPILER: clang + VERSION: 12 + + - name: clang 12 Release with UBSan + BUILD_TYPE: Release + SANITIZE_UB: ON + COMPILER: clang + VERSION: 12 + + - name: clang 12 Debug + BUILD_TYPE: Debug + COMPILER: clang + VERSION: 12 + + - name: clang 12 Debug with ASan + BUILD_TYPE: Debug + SANITIZE_ADDRESS: ON + COMPILER: clang + VERSION: 12 + + - name: clang 12 Debug with TSan + BUILD_TYPE: Debug + SANITIZE_THREAD: ON + COMPILER: clang + VERSION: 12 + + - name: clang 12 Debug with UBSan + BUILD_TYPE: Debug + SANITIZE_UB: ON + COMPILER: clang + VERSION: 12 + - name: clang 13 Release BUILD_TYPE: Release COMPILER: clang @@ -377,6 +469,52 @@ jobs: COMPILER: clang VERSION: 19 + - name: GCC 10 Release + BUILD_TYPE: Release + COMPILER: gcc + VERSION: 10 + + - name: GCC 10 Release with ASan + BUILD_TYPE: Release + SANITIZE_ADDRESS: ON + COMPILER: gcc + VERSION: 10 + + - name: GCC 10 Release with TSan + BUILD_TYPE: Release + SANITIZE_THREAD: ON + COMPILER: gcc + VERSION: 10 + + - name: GCC 10 Release with UBSan + BUILD_TYPE: Release + SANITIZE_UB: ON + COMPILER: gcc + VERSION: 10 + + - name: GCC 10 Debug + BUILD_TYPE: Debug + COMPILER: gcc + VERSION: 10 + + - name: GCC 10 Debug with ASan + BUILD_TYPE: Debug + SANITIZE_ADDRESS: ON + COMPILER: gcc + VERSION: 10 + + - name: GCC 10 Debug with TSan + BUILD_TYPE: Debug + SANITIZE_THREAD: ON + COMPILER: gcc + VERSION: 10 + + - name: GCC 10 Debug with UBSan + BUILD_TYPE: Debug + SANITIZE_UB: ON + COMPILER: gcc + VERSION: 10 + - name: GCC 11 Release BUILD_TYPE: Release COMPILER: gcc @@ -503,23 +641,27 @@ jobs: run: sudo apt-get install -y libboost-dev if: env.BOOST != 'OFF' - - name: Setup dependencies for LLVM 13 & 15+ + - name: Setup LLVM 16+ repo run: | curl 'https://apt.llvm.org/llvm-snapshot.gpg.key' \ | sudo apt-key add - sudo add-apt-repository -y \ "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-${VERSION} main" sudo apt-get update + if: env.COMPILER == 'clang' && env.VERSION >= 16 + + - name: Setup dependencies for LLVM + run: | sudo apt-get install -y "llvm-${VERSION}-linker-tools" \ "clang-${VERSION}" "clang-tidy-${VERSION}" - if: > - env.COMPILER == 'clang' - && (env.VERSION == 13 || env.VERSION >= 15) + if: env.COMPILER == 'clang' - - name: Setup dependencies for GCC 12 (versioned package) + - name: Setup dependencies for GCC 10 & 12 (versioned packages) run: | sudo apt-get install -y "gcc-${VERSION}" - if: env.COMPILER == 'gcc' && env.VERSION == '12' + if: > + env.COMPILER == 'gcc' + && (env.VERSION == '10' || env.VERSION == '12') - name: Setup dependencies for GCC 11 (default OS package) run: | @@ -555,6 +697,7 @@ jobs: EXTRA_CMAKE_ARGS=("${EXTRA_CMAKE_ARGS[@]}" "-DMAINTAINER_MODE=ON") fi fi + set +e cmake -B build "$GITHUB_WORKSPACE" -DSTANDALONE=ON \ "-DCMAKE_BUILD_TYPE=$BUILD_TYPE" \ "-DSANITIZE_ADDRESS=${SANITIZE_ADDRESS}" \ @@ -562,6 +705,16 @@ jobs: "-DSANITIZE_UB=${SANITIZE_UB}" \ "-DSPINLOCK_LOOP=${SPINLOCK_LOOP}" "-DSTATS=${STATS}" \ "${EXTRA_CMAKE_ARGS[@]}" + CMAKE_EXIT_CODE=$? + set -e + if [ $CMAKE_EXIT_CODE -ne 0 ]; then + if [ -f build/CMakeFiles/CMakeConfigureLog.yaml ]; then + echo "::group::CMakeConfigureLog.yaml" + cat build/CMakeFiles/CMakeConfigureLog.yaml + echo "::endgroup::" + fi + fi + exit $CMAKE_EXIT_CODE - name: Build working-directory: ${{github.workspace}}/build diff --git a/.github/workflows/ubuntu-20.04.yml b/.github/workflows/ubuntu-20.04.yml deleted file mode 100644 index 164e7ccd..00000000 --- a/.github/workflows/ubuntu-20.04.yml +++ /dev/null @@ -1,237 +0,0 @@ ---- -name: build-ubuntu-20.04 - -on: - push: - branches: - - master - pull_request: - -env: - DEFAULT_SANITIZE_ADDRESS: OFF - DEFAULT_SANITIZE_THREAD: OFF - DEFAULT_SANITIZE_UB: OFF - -permissions: {} - -jobs: - build: - runs-on: ubuntu-20.04 - - env: - BUILD_TYPE: ${{matrix.BUILD_TYPE}} - COMPILER: ${{matrix.COMPILER}} - VERSION: ${{matrix.VERSION}} - SANITIZE_ADDRESS: ${{matrix.SANITIZE_ADDRESS}} - SANITIZE_THREAD: ${{matrix.SANITIZE_THREAD}} - SANITIZE_UB: ${{matrix.SANITIZE_UB}} - - strategy: - fail-fast: false - matrix: - include: - - name: clang 11 Release - BUILD_TYPE: Release - COMPILER: clang - VERSION: 11 - - - name: clang 11 Release with ASan - BUILD_TYPE: Release - SANITIZE_ADDRESS: ON - COMPILER: clang - VERSION: 11 - - - name: clang 11 Release with TSan - BUILD_TYPE: Release - SANITIZE_THREAD: ON - COMPILER: clang - VERSION: 11 - - - name: clang 11 Release with UBSan - BUILD_TYPE: Release - SANITIZE_UB: ON - COMPILER: clang - VERSION: 11 - - - name: clang 11 Debug - BUILD_TYPE: Debug - COMPILER: clang - VERSION: 11 - - - name: clang 11 Debug with ASan - BUILD_TYPE: Debug - SANITIZE_ADDRESS: ON - COMPILER: clang - VERSION: 11 - - - name: clang 11 Debug with TSan - BUILD_TYPE: Debug - SANITIZE_THREAD: ON - COMPILER: clang - VERSION: 11 - - - name: clang 11 Debug with UBSan - BUILD_TYPE: Debug - SANITIZE_UB: ON - COMPILER: clang - VERSION: 11 - - - name: clang 12 Release - BUILD_TYPE: Release - COMPILER: clang - VERSION: 12 - - - name: clang 12 Release with ASan - BUILD_TYPE: Release - SANITIZE_ADDRESS: ON - COMPILER: clang - VERSION: 12 - - - name: clang 12 Release with TSan - BUILD_TYPE: Release - SANITIZE_THREAD: ON - COMPILER: clang - VERSION: 12 - - - name: clang 12 Release with UBSan - BUILD_TYPE: Release - SANITIZE_UB: ON - COMPILER: clang - VERSION: 12 - - - name: clang 12 Debug - BUILD_TYPE: Debug - COMPILER: clang - VERSION: 12 - - - name: clang 12 Debug with ASan - BUILD_TYPE: Debug - SANITIZE_ADDRESS: ON - COMPILER: clang - VERSION: 12 - - - name: clang 12 Debug with TSan - BUILD_TYPE: Debug - SANITIZE_THREAD: ON - COMPILER: clang - VERSION: 12 - - - name: clang 12 Debug with UBSan - BUILD_TYPE: Debug - SANITIZE_UB: ON - COMPILER: clang - VERSION: 12 - - - name: GCC 10 Release - BUILD_TYPE: Release - COMPILER: gcc - VERSION: 10 - - - name: GCC 10 Release with ASan - BUILD_TYPE: Release - SANITIZE_ADDRESS: ON - COMPILER: gcc - VERSION: 10 - - - name: GCC 10 Release with TSan - BUILD_TYPE: Release - SANITIZE_THREAD: ON - COMPILER: gcc - VERSION: 10 - - - name: GCC 10 Release with UBSan - BUILD_TYPE: Release - SANITIZE_UB: ON - COMPILER: gcc - VERSION: 10 - - - name: GCC 10 Debug - BUILD_TYPE: Debug - COMPILER: gcc - VERSION: 10 - - - name: GCC 10 Debug with ASan - BUILD_TYPE: Debug - SANITIZE_ADDRESS: ON - COMPILER: gcc - VERSION: 10 - - - name: GCC 10 Debug with TSan - BUILD_TYPE: Debug - SANITIZE_THREAD: ON - COMPILER: gcc - VERSION: 10 - - - name: GCC 10 Debug with UBSan - BUILD_TYPE: Debug - SANITIZE_UB: ON - COMPILER: gcc - VERSION: 10 - - - steps: - - uses: actions/checkout@v4 - with: - submodules: true - - - name: Setup common dependencies - run: | - sudo apt-get update - sudo apt-get install -y libboost-dev libc6-dev-i386 - - - name: Setup dependencies for GCC - run: | - sudo apt-get install -y "gcc-${VERSION}" "gcc-${VERSION}-multilib" - if: env.COMPILER == 'gcc' - - - name: Setup dependencies for LLVM (common) - run: | - sudo apt-get install -y "clang-${VERSION}" "clang-tidy-${VERSION}" - if: env.COMPILER == 'clang' - - - name: Setup dependencies for LLVM (Release) - run: | - sudo apt-get install -y "libomp5-${VERSION}" "llvm-${VERSION}" \ - "lld-${VERSION}" - if: env.COMPILER == 'clang' && env.BUILD_TYPE == 'Release' - - - name: Configure CMake - # Use a bash shell so we can use the same syntax for environment - # variable access regardless of the host operating system - shell: bash - run: | - SANITIZE_ADDRESS="${SANITIZE_ADDRESS:-$DEFAULT_SANITIZE_ADDRESS}" - SANITIZE_THREAD="${SANITIZE_THREAD:-$DEFAULT_SANITIZE_THREAD}" - SANITIZE_UB="${SANITIZE_UB:-$DEFAULT_SANITIZE_UB}" - if [[ $COMPILER == "gcc" ]]; then - export CC="gcc-${VERSION}" - export CXX="g++-${VERSION}" - EXTRA_CMAKE_ARGS=("-DMAINTAINER_MODE=ON") - else - export CC="clang-${VERSION}" - export CXX="clang++-${VERSION}" - EXTRA_CMAKE_ARGS=("-DCLANG_TIDY_EXE=/usr/bin/clang-tidy-${VERSION}") - if [[ $BUILD_TYPE == "Release" ]]; then - EXTRA_CMAKE_ARGS=("${EXTRA_CMAKE_ARGS[@]}" \ - "-DLLVMAR_EXECUTABLE=/usr/bin/llvm-ar-${VERSION}" \ - "-DLLVMNM_EXECUTABLE=/usr/bin/llvm-nm-${VERSION}" \ - "-DLLVMRANLIB_EXECUTABLE=/usr/bin/llvm-ranlib-${VERSION}") - fi - fi - cmake -B build "$GITHUB_WORKSPACE" -DSTANDALONE=ON \ - "-DCMAKE_BUILD_TYPE=$BUILD_TYPE" \ - "-DSANITIZE_ADDRESS=${SANITIZE_ADDRESS}" \ - "-DSANITIZE_THREAD=${SANITIZE_THREAD}" \ - "-DSANITIZE_UB=${SANITIZE_UB}" "${EXTRA_CMAKE_ARGS[@]}" - - - name: Build - working-directory: ${{github.workspace}}/build - run: make -j3 -k - - - name: Correctness test - working-directory: ${{github.workspace}}/build - run: ctest -j3 -V - - - name: Benchmark correctness test - working-directory: ${{github.workspace}}/build - run: make -k quick_benchmarks diff --git a/CMakeLists.txt b/CMakeLists.txt index 9fd4af39..8f058b8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,9 @@ set_bool(is_x86_64 "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") set_bool(is_apple_clang "${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") set_bool(is_clang "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") +set_bool(is_clang11 ${is_clang} + AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 11.0 + AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.0) set_bool(is_gxx "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") set_bool(is_any_clang ${is_apple_clang} OR ${is_clang}) @@ -288,15 +291,29 @@ if(SANITIZE_UB) # conversions do not appear to be fully suppressable list(APPEND SANITIZER_CXX_FLAGS "-fsanitize=local-bounds" "-fsanitize=nullability") - if(is_clang AND CMAKE_CXX_COMPILE_VERSION VERSION_GREATER_EQUAL 19.0) + if(is_clang AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.0) list(APPEND SANITIZER_CXX_FLAGS "-fsanitize=implicit-bitfield-conversion") endif() endif() + set(SANITIZER_LD_FLAGS "-fsanitize=undefined") + string(CONCAT UBSAN_ENV "UBSAN_OPTIONS=" "print_stacktrace=1:halt_on_error=1:abort_on_error=1") + + # clang 11 as packaged in Ubuntu 22.04 needs a workaround for + # https://github.com/llvm/llvm-project/issues/55785 + if(is_clang11) + string(APPEND UBSAN_ENV ":use_sigaltstack=false") + endif() + list(APPEND SANITIZER_ENV ${UBSAN_ENV}) unset(UBSAN_ENV) +elseif(is_clang11) + # Even though the sanitizer is not enabled here, DeepState will enable it + # itself, and clang 11 as packaged in Ubuntu 22.04, needs a workaround for + # https://github.com/llvm/llvm-project/issues/55785 + list(APPEND SANITIZER_ENV "UBSAN_OPTIONS=use_sigaltstack=false") endif() message(STATUS "SANITIZER_ENV: ${SANITIZER_ENV}") @@ -554,6 +571,20 @@ if(BENCHMARKS) endif() endif() + if(is_clang11) + # clang 11 as packaged in Ubuntu 22.04 needs a configure-time workaround + # for https://github.com/llvm/llvm-project/issues/55785 + if(SANITIZE_ADDRESS) + set(ENV{ASAN_OPTIONS} "use_sigaltstack=false") + endif() + if(SANITIZE_THREAD) + set(ENV{TSAN_OPTIONS} "use_sigaltstack=false") + endif() + if(SANITIZE_UB) + set(ENV{UBSAN_OPTIONS} "use_sigaltstack=false") + endif() + endif() + ADD_CXX_FLAGS_FOR_SUBDIR() add_subdirectory(3rd_party/benchmark) RESTORE_CXX_FLAGS_FOR_SUBDIR() @@ -798,7 +829,12 @@ if(TESTS) function(add_sanitized_test) cmake_parse_arguments(AST "" "NAME" "COMMAND" ${ARGN}) add_test(NAME "${AST_NAME}" COMMAND ${AST_COMMAND}) - if(SANITIZE_ADDRESS OR SANITIZE_THREAD OR SANITIZE_UB) + # Set Sanitizer environment on a sanitizer-less build too, if using clang + # 11 and DeepState is built, because it enables sanitizers itself. clang 11 + # handling is to workaround + # https://github.com/llvm/llvm-project/issues/55785 on Ubuntu 22.04. + if(SANITIZE_ADDRESS OR SANITIZE_THREAD OR SANITIZE_UB + OR (TARGET deepstate AND is_clang11)) set_property(TEST "${AST_NAME}" APPEND PROPERTY ENVIRONMENT "${SANITIZER_ENV}") endif()