Skip to content

Commit c50d312

Browse files
committed
build: check the combination of Sanitizers
we are going to add a build with ThreadSanitizer enabled, but ThreadSanitizer cannot be used along with AddressSanitizer. the existing sanitizer detection checks each sanitizer separately, so even if the sanitizers combination does not work, the detection still passes. also, we hardwire two sanitizers in `FindSanitizers.cmake`, this is not extensible to the use case where we only need to selectively find a certain (combination) of sanitizers. in order to address these problems, in this change * find specified component(s) in FindSanitizers.cmake, to prepare for the change which selectively specifies a subset of sanitizers * check if the compiler supports the combination of compile options required by all specified sanitizers * explicitly specify the used sanitizers in `SeastarDependencies.cmake`. Signed-off-by: Kefu Chai <[email protected]>
1 parent ec5da7a commit c50d312

File tree

2 files changed

+47
-40
lines changed

2 files changed

+47
-40
lines changed

cmake/FindSanitizers.cmake

+43-40
Original file line numberDiff line numberDiff line change
@@ -20,54 +20,57 @@
2020
# Copyright (C) 2018 Scylladb, Ltd.
2121
#
2222

23-
include (CheckCXXSourceCompiles)
24-
25-
set (CMAKE_REQUIRED_FLAGS -fsanitize=address)
26-
check_cxx_source_compiles ("int main() {}" Sanitizers_ADDRESS_FOUND)
27-
28-
if (Sanitizers_ADDRESS_FOUND)
29-
set (Sanitizers_ADDRESS_COMPILER_OPTIONS -fsanitize=address)
30-
endif ()
23+
foreach (component ${Sanitizers_FIND_COMPONENTS})
24+
string (TOUPPER ${component} COMPONENT)
25+
set (compile_options "Sanitizers_${COMPONENT}_COMPILE_OPTIONS")
26+
if (component STREQUAL "address")
27+
list (APPEND ${compile_options} -fsanitize=address)
28+
elseif (component STREQUAL "undefined_behavior")
29+
list (APPEND ${compile_options} -fsanitize=undefined)
30+
# Disable vptr because of https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88684
31+
list (APPEND ${compile_options} -fno-sanitize=vptr)
32+
else ()
33+
message (FATAL_ERROR "Unsupported sanitizer: ${component}")
34+
endif ()
35+
list(APPEND Sanitizers_COMPILE_OPTIONS "${${compile_options}}")
36+
endforeach ()
3137

32-
set (CMAKE_REQUIRED_FLAGS -fsanitize=undefined)
33-
check_cxx_source_compiles ("int main() {}" Sanitizers_UNDEFINED_BEHAVIOR_FOUND)
38+
include(CheckCXXSourceCompiles)
39+
include(CMakePushCheckState)
3440

35-
if (Sanitizers_UNDEFINED_BEHAVIOR_FOUND)
36-
# Disable vptr because of https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88684
37-
set (Sanitizers_UNDEFINED_BEHAVIOR_COMPILER_OPTIONS "-fsanitize=undefined;-fno-sanitize=vptr")
41+
# -fsanitize=address cannot be combined with -fsanitize=thread, so let's test
42+
# the combination of the compiler options.
43+
cmake_push_check_state()
44+
string (REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${Sanitizers_COMPILE_OPTIONS}")
45+
set(CMAKE_REQUIRED_FLAGS ${Sanitizers_COMPILE_OPTIONS})
46+
check_cxx_source_compiles("int main() {}"
47+
Sanitizers_SUPPORTED)
48+
if (Sanitizers_SUPPORTED)
49+
if ("address" IN_LIST Sanitizers_FIND_COMPONENTS)
50+
file (READ ${CMAKE_CURRENT_LIST_DIR}/code_tests/Sanitizers_fiber_test.cc _sanitizers_fiber_test_code)
51+
check_cxx_source_compiles ("${_sanitizers_fiber_test_code}"
52+
Sanitizers_FIBER_SUPPORT)
53+
endif ()
3854
endif ()
39-
40-
set (Sanitizers_COMPILER_OPTIONS
41-
${Sanitizers_ADDRESS_COMPILER_OPTIONS}
42-
${Sanitizers_UNDEFINED_BEHAVIOR_COMPILER_OPTIONS})
43-
44-
file (READ ${CMAKE_CURRENT_LIST_DIR}/code_tests/Sanitizers_fiber_test.cc _sanitizers_fiber_test_code)
45-
set (CMAKE_REQUIRED_FLAGS ${Sanitizers_COMPILER_OPTIONS})
46-
check_cxx_source_compiles ("${_sanitizers_fiber_test_code}" Sanitizers_FIBER_SUPPORT)
55+
cmake_pop_check_state()
4756

4857
include (FindPackageHandleStandardArgs)
4958

5059
find_package_handle_standard_args (Sanitizers
5160
REQUIRED_VARS
52-
Sanitizers_ADDRESS_COMPILER_OPTIONS
53-
Sanitizers_UNDEFINED_BEHAVIOR_COMPILER_OPTIONS)
61+
Sanitizers_COMPILE_OPTIONS
62+
Sanitizers_SUPPORTED)
5463

5564
if (Sanitizers_FOUND)
56-
if (NOT (TARGET Sanitizers::address))
57-
add_library (Sanitizers::address INTERFACE IMPORTED)
58-
59-
set_target_properties (Sanitizers::address
60-
PROPERTIES
61-
INTERFACE_COMPILE_OPTIONS ${Sanitizers_ADDRESS_COMPILER_OPTIONS}
62-
INTERFACE_LINK_LIBRARIES ${Sanitizers_ADDRESS_COMPILER_OPTIONS})
63-
endif ()
64-
65-
if (NOT (TARGET Sanitizers::undefined_behavior))
66-
add_library (Sanitizers::undefined_behavior INTERFACE IMPORTED)
67-
68-
set_target_properties (Sanitizers::undefined_behavior
69-
PROPERTIES
70-
INTERFACE_COMPILE_OPTIONS "${Sanitizers_UNDEFINED_BEHAVIOR_COMPILER_OPTIONS}"
71-
INTERFACE_LINK_LIBRARIES "${Sanitizers_UNDEFINED_BEHAVIOR_COMPILER_OPTIONS}")
72-
endif ()
65+
foreach (component ${Sanitizers_FIND_COMPONENTS})
66+
string (TOUPPER ${component} COMPONENT)
67+
set (library Sanitizers::${component})
68+
if (NOT TARGET ${library})
69+
add_library (${library} INTERFACE IMPORTED)
70+
set_target_properties (${library}
71+
PROPERTIES
72+
INTERFACE_COMPILE_OPTIONS "${Sanitizers_${COMPONENT}_COMPILE_OPTIONS}"
73+
INTERFACE_LINK_LIBRARIES "${Sanitizers_${COMPONENT}_COMPILE_OPTIONS}")
74+
endif ()
75+
endforeach ()
7376
endif ()

cmake/SeastarDependencies.cmake

+4
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,10 @@ macro (seastar_find_dependencies)
141141
seastar_set_dep_args (rt REQUIRED)
142142
seastar_set_dep_args (numactl
143143
OPTION ${Seastar_NUMA})
144+
seastar_set_dep_args (Sanitizers
145+
COMPONENTS
146+
address
147+
undefined_behavior)
144148
seastar_set_dep_args (ucontext REQUIRED)
145149
seastar_set_dep_args (yaml-cpp REQUIRED
146150
VERSION 0.5.1)

0 commit comments

Comments
 (0)