From 7434aa9c18591845cea55d3b5c64130855c9d5ab Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Sun, 16 May 2021 00:33:16 -0400 Subject: [PATCH] Catch2 ASAN support with Windows MSVC ASAN on Windows messes with exception handlers, and Catch2 doesn't account for this. A workaround is to disable SEH on Windows with ASAN as suggested in this reply to an existing issue https://github.com/catchorg/Catch2/issues/898#issuecomment-841733322 --- .github/workflows/ci.yml | 5 +++++ tests/CMakeLists.txt | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3b35eb4..b3bffb9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -110,6 +110,10 @@ jobs: - uses: actions/checkout@v2 with: submodules: 'true' + - name: Enable ASan Sanitizers + if: matrix.build-type == 'Debug' && matrix.build-arch == 'x64' + run: | + echo "SANITIZER_FLAG=-DPEPARSE_USE_SANITIZER=Address" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append - name: build run: | mkdir build @@ -119,6 +123,7 @@ jobs: -A ${{ matrix.build-arch }} ` -DBUILD_SHARED_LIBS=${{ matrix.build-shared }} ` -DPEPARSE_ENABLE_TESTING=ON ` + $Env:SANITIZER_FLAG ` .. cmake --build . --config ${{ matrix.build-type }} - name: install diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 33e02d6..dd20566 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -28,8 +28,14 @@ add_executable(tests filesystem_compat.h ) target_compile_definitions(tests PRIVATE ASSETS_DIR="${CMAKE_CURRENT_SOURCE_DIR}/assets") -target_link_libraries(tests PRIVATE std::filesystem ${PROJECT_NAME} Catch2::Catch2) target_include_directories(tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(tests PRIVATE std::filesystem ${PROJECT_NAME} Catch2::Catch2) +# ASAN on Windows messes with exception handlers, and Catch2 doesn't account +# for this. A workaround is to disable SEH on Windows with ASAN +# https://github.com/catchorg/Catch2/issues/898#issuecomment-841733322 +if (WIN32 AND PEPARSE_USE_SANITIZER STREQUAL "Address") + target_compile_definitions(tests PUBLIC CATCH_CONFIG_NO_WINDOWS_SEH) +endif() if (EXISTS "${CORKAMI_PE_PATH}") target_compile_definitions(tests PRIVATE CORKAMI_PE_PATH="${CORKAMI_PE_PATH}")