From 41a08eb3eeebb0d4856e3688e7ebf531178b3bad 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 CI requires some sourcing of the development tools for required paths --- .github/workflows/ci.yml | 8 ++++++++ tests/CMakeLists.txt | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3b35eb4..3eecb98 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -110,6 +110,13 @@ 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 + - uses: ilammy/msvc-dev-cmd@v1.8.0 + with: + arch: ${{ matrix.build-arch }} - name: build run: | mkdir build @@ -119,6 +126,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}")