3
# This module sets the following targets:
11
option(UBSAN_FLAGS "additional UBSAN flags" OFF)
13
get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES)
19
printf("hello world!");
24
include(CMakePushCheckState)
25
cmake_push_check_state(RESET)
26
foreach(sanitizer_name IN ITEMS address thread undefined leak memory)
27
if(TARGET Sanitizer::${sanitizer_name})
31
set(CMAKE_REQUIRED_FLAGS
32
"-fsanitize=${sanitizer_name};-fno-omit-frame-pointer")
33
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" OR CMAKE_C_COMPILER_ID STREQUAL
35
if(sanitizer_name STREQUAL "address")
36
set(CMAKE_REQUIRED_FLAGS "/fsanitize=${sanitizer_name}")
41
if(sanitizer_name STREQUAL "address")
42
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_C_COMPILER_ID STREQUAL
44
list(APPEND CMAKE_REQUIRED_FLAGS "-shared-libasan")
47
if(sanitizer_name STREQUAL "undefined" AND UBSAN_FLAGS)
48
list(APPEND CMAKE_REQUIRED_FLAGS "${UBSAN_FLAGS}")
50
if(sanitizer_name STREQUAL "memory")
51
list(APPEND CMAKE_REQUIRED_FLAGS "-fsanitize-memory-track-origins=2")
54
set(CMAKE_REQUIRED_QUIET ON)
56
include(CheckCSourceRuns)
57
include(CheckCXXSourceRuns)
58
foreach(lang IN LISTS languages)
60
check_c_source_runs("${_source_code}"
61
__${lang}_${sanitizer_name}_res)
62
if(__${lang}_${sanitizer_name}_res)
67
check_cxx_source_runs("${_source_code}"
68
__${lang}_${sanitizer_name}_res)
69
if(__${lang}_${sanitizer_name}_res)
75
add_library(Sanitizer::${sanitizer_name} INTERFACE IMPORTED GLOBAL)
76
target_compile_options(
77
Sanitizer::${sanitizer_name}
79
$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<BOOL:$__CXX_${sanitizer_name}_res>>:${CMAKE_REQUIRED_FLAGS}>
80
$<$<AND:$<COMPILE_LANGUAGE:C>,$<BOOL:$__C_${sanitizer_name}_res>>:${CMAKE_REQUIRED_FLAGS}>
82
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" AND NOT CMAKE_C_COMPILER_ID
85
Sanitizer::${sanitizer_name}
87
$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<BOOL:$__CXX_${sanitizer_name}_res>>:${CMAKE_REQUIRED_FLAGS}>
88
$<$<AND:$<COMPILE_LANGUAGE:C>,$<BOOL:$__C_${sanitizer_name}_res>>:${CMAKE_REQUIRED_FLAGS}>
92
Sanitizer::${sanitizer_name}
94
$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<BOOL:$__CXX_${sanitizer_name}_res>>:/INCREMENTAL:NO>
95
$<$<AND:$<COMPILE_LANGUAGE:C>,$<BOOL:$__C_${sanitizer_name}_res>>:/INCREMENTAL:NO>
99
if(sanitizer_name STREQUAL "address")
100
target_compile_definitions(
101
Sanitizer::${sanitizer_name}
103
$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<BOOL:$__CXX_${sanitizer_name}_res>>:_GLIBCXX_SANITIZE_VECTOR>
104
$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<BOOL:$__CXX_${sanitizer_name}_res>>:_GLIBCXX_SANITIZE_STD_ALLOCATOR>
107
Sanitizer::${sanitizer_name}
109
$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<BOOL:$__CXX_${sanitizer_name}_res>,$<CXX_COMPILER_ID:GNU>>:-lasan>
110
$<$<AND:$<COMPILE_LANGUAGE:C>,$<BOOL:$__C_${sanitizer_name}_res>,$<C_COMPILER_ID:GNU>>:-lasan>
113
if(sanitizer_name STREQUAL "undefined")
115
Sanitizer::${sanitizer_name}
117
$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<BOOL:$__CXX_${sanitizer_name}_res>,$<CXX_COMPILER_ID:GNU>>:-lubsan>
118
$<$<AND:$<COMPILE_LANGUAGE:C>,$<BOOL:$__C_${sanitizer_name}_res>,$<C_COMPILER_ID:GNU>>:-lubsan>
124
cmake_pop_check_state()