Skip to content

Commit fa285ae

Browse files
committed
build: check 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 * rename the component name of "address" and "undefined_behavior" to "Address" and "UndefinedBehavior" to match their names at https://github.com/google/sanitizers * 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 83e6cdf commit fa285ae

File tree

3 files changed

+49
-42
lines changed

3 files changed

+49
-42
lines changed

CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -884,8 +884,8 @@ if (condition)
884884
set (Seastar_Sanitizers_OPTIONS ${Sanitizers_COMPILER_OPTIONS})
885885
target_link_libraries (seastar
886886
PUBLIC
887-
$<${condition}:Sanitizers::address>
888-
$<${condition}:Sanitizers::undefined_behavior>)
887+
$<${condition}:Sanitizers::Address>
888+
$<${condition}:Sanitizers::UndefinedBehavior>)
889889
endif ()
890890

891891
# We only need valgrind to find uninitialized memory uses, so disable

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 "UndefinedBehavior")
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+
UndefinedBehavior)
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)