Skip to content

Commit 1a99a28

Browse files
committed
Fix add_sanitizer_flag macro for MSVC
1 parent 168e7d9 commit 1a99a28

File tree

1 file changed

+32
-20
lines changed

1 file changed

+32
-20
lines changed

cmake/helpers.cmake

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -111,19 +111,17 @@ endfunction()
111111

112112
# Add sanitizer ${flag}, if it is supported, for both C and C++ compiler
113113
macro(add_sanitizer_flag flag)
114-
# Save current 'CMAKE_REQUIRED_LIBRARIES' state and temporarily extend it with
115-
# '-fsanitize=${flag}'. It is required by CMake to check the compiler for
116-
# availability of provided sanitizer ${flag}.
117-
if(WINDOWS)
118-
set(SANITIZER_FLAG "/fsanitize=${flag}")
119-
set(SANITIZER_ARGS "")
120-
else()
121-
set(SANITIZER_FLAG "-fsanitize=${flag}")
114+
set(SANITIZER_FLAG "-fsanitize=${flag}")
115+
if (NOT MSVC)
116+
# Not available on MSVC.
122117
set(SANITIZER_ARGS "-fno-sanitize-recover=all")
123118
endif()
124119

125-
set(SAVED_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
126-
set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES} ${SANITIZER_FLAG}")
120+
# Save current 'SAVED_CMAKE_REQUIRED_FLAGS' state and temporarily extend it
121+
# with '-fsanitize=${flag}'. It is required by CMake to check the compiler
122+
# for availability of provided sanitizer ${flag}.
123+
set(SAVED_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
124+
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${SANITIZER_FLAG}")
127125

128126
if(${flag} STREQUAL "address")
129127
set(check_name "HAS_ASAN")
@@ -138,18 +136,32 @@ macro(add_sanitizer_flag flag)
138136
# Check C and CXX compilers for given sanitizer flag.
139137
check_c_compiler_flag("${SANITIZER_FLAG}" "C_${check_name}")
140138
check_cxx_compiler_flag("${SANITIZER_FLAG}" "CXX_${check_name}")
141-
if (${C_${check_name}} OR ${CXX_${check_name}})
142-
# Set appropriate linker flags for building executables.
143-
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${SANITIZER_FLAG} ${SANITIZER_ARGS}")
144-
if (${C_${check_name}})
145-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZER_FLAG} ${SANITIZER_ARGS}")
146-
endif()
147-
if (${CXX_${check_name}})
148-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZER_FLAG} ${SANITIZER_ARGS}")
139+
if (NOT ${C_${check_name}} OR NOT ${CXX_${check_name}})
140+
message(FATAL_ERROR "${flag} sanitizer is not supported (either by C or CXX compiler)")
141+
endif()
142+
143+
# Check C and CXX compilers for sanitizer arguments.
144+
if (${SANITIZER_ARGS})
145+
check_c_compiler_flag("${SANITIZER_ARGS}" "C_HAS_SAN_ARGS")
146+
check_cxx_compiler_flag("${SANITIZER_ARGS}" "CXX_HAS_SAN_ARGS")
147+
148+
if (NOT ${C_HAS_SAN_ARGS} OR NOT ${CXX_HAS_SAN_ARGS})
149+
message(FATAL_ERROR "sanitizer argument ${SANITIZER_ARGS} is not supported (either by C or CXX compiler)")
149150
endif()
151+
152+
set(SANITIZER_OPTION "${SANITIZER_FLAG} ${SANITIZER_ARGS}")
150153
else()
151-
message(FATAL_ERROR "${flag} sanitizer is not supported (neither by C nor CXX compiler)")
154+
# No sanitizer argument was set. For now, that's the case for MSVC.
155+
set(SANITIZER_OPTION "${SANITIZER_FLAG}")
156+
endif()
157+
158+
add_compile_options("${SANITIZER_OPTION}")
159+
160+
# Clang/gcc needs the flag added to the linker. The Microsoft LINK linker doesn't recognize
161+
# sanitizer flags and will give a LNK4044 warning.
162+
if (NOT MSVC)
163+
add_link_options("${SANITIZER_OPTION}")
152164
endif()
153165

154-
set(CMAKE_REQUIRED_LIBRARIES ${SAVED_CMAKE_REQUIRED_LIBRARIES})
166+
set(CMAKE_REQUIRED_FLAGS ${SAVED_CMAKE_REQUIRED_FLAGS})
155167
endmacro()

0 commit comments

Comments
 (0)