diff --git a/cmake/ECM/modules/ECMEnableSanitizers.cmake b/cmake/ECM/modules/ECMEnableSanitizers.cmake index eee9c0ec..87fe0d2e 100644 --- a/cmake/ECM/modules/ECMEnableSanitizers.cmake +++ b/cmake/ECM/modules/ECMEnableSanitizers.cmake @@ -103,34 +103,47 @@ endmacro () # MACRO check_compiler_support #------------------------------ macro (enable_sanitizer_flags sanitize_option) - if (${sanitize_option} MATCHES "address") - check_compiler_version("4.8" "3.1") - set(XSAN_COMPILE_FLAGS "-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls") - set(XSAN_LINKER_FLAGS "asan") - elseif (${sanitize_option} MATCHES "thread") - check_compiler_version("4.8" "3.1") - set(XSAN_COMPILE_FLAGS "-fsanitize=thread") - set(XSAN_LINKER_FLAGS "tsan") - elseif (${sanitize_option} MATCHES "memory") - check_compiler_version("99.99" "3.1") - set(XSAN_COMPILE_FLAGS "-fsanitize=memory") - elseif (${sanitize_option} MATCHES "leak") - check_compiler_version("4.9" "3.4") - set(XSAN_COMPILE_FLAGS "-fsanitize=leak") - set(XSAN_LINKER_FLAGS "lsan") - elseif (${sanitize_option} MATCHES "undefined") - check_compiler_version("4.9" "3.1") - set(XSAN_COMPILE_FLAGS "-fsanitize=undefined -fsanitize=float-divide-by-zero -fno-omit-frame-pointer -fno-optimize-sibling-calls") - elseif (${sanitize_option} MATCHES "fuzzer-no-link") - check_compiler_version("99.99" "6.0") - set(XSAN_COMPILE_FLAGS "-fsanitize=fuzzer-no-link") - set(XSAN_LINKER_FLAGS "-fsanitize=fuzzer-no-link") - elseif (${sanitize_option} MATCHES "fuzzer") - check_compiler_version("99.99" "6.0") - set(XSAN_COMPILE_FLAGS "-fsanitize=fuzzer") - else () - message(FATAL_ERROR "Compiler sanitizer option \"${sanitize_option}\" not supported.") - endif () + if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + if (${sanitize_option} MATCHES "address") + set(msvc_asan_required_version "19.28") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${msvc_asan_required_version}) + message(WARNING "Address sanitizer requires at least MSVC ${msvc_asan_required_version}") + else() + set(XSAN_COMPILE_FLAGS "-fsanitize=address") + endif() + else() + message(WARNING "Compiler sanitizer option \"${sanitize_option}\" not supported on MSVC yet") + endif() + else() + if (${sanitize_option} MATCHES "address") + check_compiler_version("4.8" "3.1") + set(XSAN_COMPILE_FLAGS "-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls") + set(XSAN_LINKER_FLAGS "asan") + elseif (${sanitize_option} MATCHES "thread") + check_compiler_version("4.8" "3.1") + set(XSAN_COMPILE_FLAGS "-fsanitize=thread") + set(XSAN_LINKER_FLAGS "tsan") + elseif (${sanitize_option} MATCHES "memory") + check_compiler_version("99.99" "3.1") + set(XSAN_COMPILE_FLAGS "-fsanitize=memory") + elseif (${sanitize_option} MATCHES "leak") + check_compiler_version("4.9" "3.4") + set(XSAN_COMPILE_FLAGS "-fsanitize=leak") + set(XSAN_LINKER_FLAGS "lsan") + elseif (${sanitize_option} MATCHES "undefined") + check_compiler_version("4.9" "3.1") + set(XSAN_COMPILE_FLAGS "-fsanitize=undefined -fsanitize=float-divide-by-zero -fno-omit-frame-pointer -fno-optimize-sibling-calls") + elseif (${sanitize_option} MATCHES "fuzzer-no-link") + check_compiler_version("99.99" "6.0") + set(XSAN_COMPILE_FLAGS "-fsanitize=fuzzer-no-link") + set(XSAN_LINKER_FLAGS "-fsanitize=fuzzer-no-link") + elseif (${sanitize_option} MATCHES "fuzzer") + check_compiler_version("99.99" "6.0") + set(XSAN_COMPILE_FLAGS "-fsanitize=fuzzer") + else () + message(FATAL_ERROR "Compiler sanitizer option \"${sanitize_option}\" not supported.") + endif () + endif() endmacro () if (ECM_ENABLE_SANITIZERS) @@ -154,6 +167,11 @@ if (ECM_ENABLE_SANITIZERS) string(REPLACE "-Wl,--no-undefined" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}") endif () endforeach() + elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + foreach (CUR_SANITIZER ${ECM_ENABLE_SANITIZERS}) + enable_sanitizer_flags(${CUR_SANITIZER}) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${XSAN_COMPILE_FLAGS}") + endforeach() else() message(STATUS "Tried to enable sanitizers (-DECM_ENABLE_SANITIZERS=${ECM_ENABLE_SANITIZERS}), \ but compiler (${CMAKE_CXX_COMPILER_ID}) does not have sanitizer support")