From 41a08eb3eeebb0d4856e3688e7ebf531178b3bad Mon Sep 17 00:00:00 2001
From: Eric Kilmer <eric.d.kilmer@gmail.com>
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}")