summaryrefslogtreecommitdiffstats
path: root/cmake/QtSanitizerHelpers.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/QtSanitizerHelpers.cmake')
-rw-r--r--cmake/QtSanitizerHelpers.cmake65
1 files changed, 47 insertions, 18 deletions
diff --git a/cmake/QtSanitizerHelpers.cmake b/cmake/QtSanitizerHelpers.cmake
index 5514465178..2a933b2222 100644
--- a/cmake/QtSanitizerHelpers.cmake
+++ b/cmake/QtSanitizerHelpers.cmake
@@ -1,31 +1,60 @@
-function(qt_internal_set_up_sanitizer_features)
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# Computes which sanitizer options should be set based on features evaluated in qtbase.
+# Sets ECM_ENABLE_SANITIZERS with those options in the function calling scope.
+function(qt_internal_set_up_sanitizer_options)
set(ECM_ENABLE_SANITIZERS "" CACHE STRING "Enable sanitizers")
- set_property(CACHE ECM_ENABLE_SANITIZERS PROPERTY STRINGS "address;memory;thread;undefined")
+ set_property(CACHE ECM_ENABLE_SANITIZERS PROPERTY STRINGS
+ "address;memory;thread;undefined;fuzzer;fuzzer-no-link")
- # If FEATURE_sanitize_foo is set on the command line, make sure to set the appropriate
- # ECM_ENABLE_SANITIZERS value. Also the other way around. This basically allows setting either
- # the feature or ECM_ENABLE_SANITIZERS directly.
- #
- # TODO: Decide which one of these should be the source of truth, because reconfiguration with
- # different options might not work as expected when ECM_ENABLE_SANITIZERS is provided instead of
- # the features.
+ # If QT_FEATURE_sanitize_foo was enabled, make sure to set the appropriate
+ # ECM_ENABLE_SANITIZERS value.
set(enabled_sanitizer_features "")
foreach(sanitizer_type address memory thread undefined)
- if(FEATURE_sanitize_${sanitizer_type})
+ if(QT_FEATURE_sanitize_${sanitizer_type})
list(APPEND enabled_sanitizer_features "${sanitizer_type}")
endif()
endforeach()
+
+ # There's a mismatch between fuzzer-no-link ECM option and fuzzer_no_link Qt feature.
+ if(QT_FEATURE_sanitize_fuzzer_no_link)
+ list(APPEND enabled_sanitizer_features "fuzzer-no-link")
+ endif()
+
if(enabled_sanitizer_features)
- set(ECM_ENABLE_SANITIZERS
- "${enabled_sanitizer_features}" CACHE STRING "Enable sanitizers" FORCE)
+ set(ECM_ENABLE_SANITIZERS "${enabled_sanitizer_features}" PARENT_SCOPE)
endif()
+endfunction()
- if(ECM_ENABLE_SANITIZERS)
- foreach(sanitizer_type ${ECM_ENABLE_SANITIZERS})
- message(STATUS "Enabling sanitizer: ${sanitizer_type}")
- set(feature_name "FEATURE_sanitize_${sanitizer_type}")
- set(${feature_name} "ON" CACHE BOOL "Enable ${sanitizer_type} sanitizer" FORCE)
- set(QT_${feature_name} "ON" CACHE BOOL "Enable ${sanitizer_type} sanitizer" FORCE)
+# This function clears the previously set sanitizer flags from CMAKE_<C|CXX>_FLAGS
+function(qt_internal_skip_sanitizer)
+ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
+ CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR
+ CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
+ foreach(sanitizer ${ECM_ENABLE_SANITIZERS})
+ string(TOLOWER "${sanitizer}" sanitizer)
+ enable_sanitizer_flags("${sanitizer}")
+ qt_internal_remove_compiler_flags(${XSAN_COMPILE_FLAGS})
endforeach()
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" PARENT_SCOPE)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" PARENT_SCOPE)
endif()
endfunction()
+
+# This function disables the sanitizer library linking to all targets created in a subdirectory
+# where the function is called. Note that the function should be called after all involved targets
+# are created, to make sure they are collected by the function.
+function(qt_internal_skip_linking_sanitizer)
+ _qt_internal_collect_buildsystem_targets(all_targets "${CMAKE_CURRENT_SOURCE_DIR}"
+ INCLUDE
+ STATIC_LIBRARY
+ MODULE_LIBRARY
+ SHARED_LIBRARY
+ OBJECT_LIBRARY
+ EXECUTABLE
+ )
+ foreach(t IN LISTS all_targets)
+ set_property(TARGET ${t} PROPERTY SKIP_SANITIZER TRUE)
+ endforeach()
+endfunction()