@@ -111,19 +111,17 @@ endfunction()
111
111
112
112
# Add sanitizer ${flag}, if it is supported, for both C and C++ compiler
113
113
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.
122
117
set (SANITIZER_ARGS "-fno-sanitize-recover=all" )
123
118
endif ()
124
119
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} " )
127
125
128
126
if (${flag} STREQUAL "address" )
129
127
set (check_name "HAS_ASAN" )
@@ -138,18 +136,32 @@ macro(add_sanitizer_flag flag)
138
136
# Check C and CXX compilers for given sanitizer flag.
139
137
check_c_compiler_flag ("${SANITIZER_FLAG} " "C_${check_name} " )
140
138
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)" )
149
150
endif ()
151
+
152
+ set (SANITIZER_OPTION "${SANITIZER_FLAG} ${SANITIZER_ARGS} " )
150
153
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} " )
152
164
endif ()
153
165
154
- set (CMAKE_REQUIRED_LIBRARIES ${SAVED_CMAKE_REQUIRED_LIBRARIES } )
166
+ set (CMAKE_REQUIRED_FLAGS ${SAVED_CMAKE_REQUIRED_FLAGS } )
155
167
endmacro ()
0 commit comments