|
1 | | -set(AVAILABLE_SANITIZERS "address;leak;memory;thread;undefined") |
2 | | -OPTION(USE_SANITIZER "Enable sanitizer(s). Options are: ${AVAILABLE_SANITIZERS}. Case insensitive; multiple options delimited by comma or space possible." "") |
| 1 | +set(AVALAIBLE_SANITIZERS "address;leak;memory;thread;undefined") |
| 2 | +OPTION(USE_SANITIZER "Enable sanitizer(s). Options are: ${AVALAIBLE_SANITIZERS}. Case insensitive; multiple options delimited by comma or space possible." "") |
3 | 3 | string(TOLOWER "${USE_SANITIZER}" USE_SANITIZER) |
4 | 4 |
|
5 | | -if(USE_SANITIZER AND NOT (CMAKE_BUILD_TYPE IN_LIST "Debug;RelWithDebInfo")) |
6 | | - message(FATAL_ERROR "❌ Sanitizer only supported in Debug and RelWithDebInfo build types. Current: ${CMAKE_BUILD_TYPE}") |
| 5 | +if((CMAKE_BUILD_TYPE IN_LIST "Debug;RelWithDebInfo") AND USE_SANITIZER) |
| 6 | + message(FATAL_ERROR "❌ Sanitizer only supported in Debug and RelWithDebInfo build types.") |
7 | 7 | endif() |
8 | 8 |
|
9 | 9 | if(USE_SANITIZER) |
10 | 10 | if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") |
11 | 11 | set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>") |
12 | 12 |
|
13 | 13 | if(USE_SANITIZER MATCHES "address") |
14 | | - string(APPEND CMAKE_CXX_FLAGS " /fsanitize=address /D_DISABLE_VECTOR_ANNOTATION /D_DISABLE_STRING_ANNOTATION") |
15 | | - string(APPEND CMAKE_EXE_LINKER_FLAGS " /fsanitize=address") |
| 14 | + list(APPEND SANITIZER_COMPILE_OPTIONS /fsanitize=address /D_DISABLE_VECTOR_ANNOTATION /D_DISABLE_STRING_ANNOTATION) |
16 | 15 | else() |
17 | 16 | message(FATAL_ERROR "❌ Sanitizer not supported by MSVC: ${USE_SANITIZER}. It only supports 'address'.") |
18 | 17 | endif() |
19 | 18 | elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") |
20 | 19 | if(USE_SANITIZER MATCHES "address") |
21 | | - string(APPEND CMAKE_CXX_FLAGS " /fsanitize=address /D_DISABLE_VECTOR_ANNOTATION /D_DISABLE_STRING_ANNOTATION") |
22 | | - string(APPEND CMAKE_EXE_LINKER_FLAGS " /fsanitize=address") |
| 20 | + list(APPEND SANITIZER_COMPILE_OPTIONS /fsanitize=address /D_DISABLE_VECTOR_ANNOTATION /D_DISABLE_STRING_ANNOTATION) |
| 21 | + list(APPEND SANITIZER_LINK_LIBRARIES clang_rt.asan_dynamic-x86_64 clang_rt.asan_dynamic_runtime_thunk-x86_64) |
23 | 22 | else() |
24 | 23 | message(FATAL_ERROR "❌ Sanitizer not supported by Clang-MSVC: ${USE_SANITIZER}. It only supports 'address'.") |
25 | 24 | endif() |
26 | 25 | elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") |
27 | 26 | foreach(sanitizer ${USE_SANITIZER}) |
28 | | - if(NOT ${sanitizer} IN_LIST AVAILABLE_SANITIZERS) |
29 | | - message(FATAL_ERROR "❌ Sanitizer not supported: ${sanitizer}. It should be one of: ${AVAILABLE_SANITIZERS}.") |
| 27 | + if(NOT ${sanitizer} IN_LIST AVALAIBLE_SANITIZERS) |
| 28 | + message(FATAL_ERROR "❌ Sanitizer not supported: ${sanitizer}. It should be one of: ${AVALAIBLE_SANITIZERS}.") |
30 | 29 | endif() |
31 | | - string(APPEND CMAKE_CXX_FLAGS " -fsanitize=${sanitizer}") |
32 | | - string(APPEND CMAKE_EXE_LINKER_FLAGS " -fsanitize=${sanitizer}") |
33 | | - if(${sanitizer} MATCHES "memory") |
34 | | - string(APPEND CMAKE_CXX_FLAGS " -fsanitize-memory-track-origins -fPIE -pie") |
35 | | - string(APPEND CMAKE_EXE_LINKER_FLAGS " -fsanitize-memory-track-origins -fPIE -pie") |
| 30 | + list(APPEND SANITIZER_COMPILE_OPTIONS -fsanitize=${sanitizer}) |
| 31 | + list(APPEND SANITIZER_LINK_OPTIONS -fsanitize=${sanitizer}) |
| 32 | + if (${sanitizer} MATCHES "memory") |
| 33 | + list(APPEND SANITIZER_LINK_LIBRARIES -fsanitize-memory-track-origins -fPIE -pie) |
| 34 | + list(APPEND SANITIZER_LINK_OPTIONS -fsanitize-memory-track-origins -fPIE -pie) |
36 | 35 | endif() |
37 | 36 | endforeach() |
38 | | - string(APPEND CMAKE_CXX_FLAGS " -fno-omit-frame-pointer") |
| 37 | + list(APPEND SANITIZER_COMPILE_OPTIONS -fno-omit-frame-pointer) |
39 | 38 | else() |
40 | 39 | message(FATAL_ERROR "❌ Sanitizer: Unsupported compiler: ${CMAKE_CXX_COMPILER_ID}") |
41 | 40 | endif() |
42 | 41 |
|
| 42 | + list(REMOVE_DUPLICATES SANITIZER_COMPILE_OPTIONS) |
| 43 | + list(REMOVE_DUPLICATES SANITIZER_LINK_OPTIONS) |
| 44 | + list(REMOVE_DUPLICATES SANITIZER_LINK_LIBRARIES) |
| 45 | + |
43 | 46 | message(STATUS "🔍 Using sanitizer: ${USE_SANITIZER}") |
44 | 47 | endif() |
0 commit comments