From 1ffc42ef43511d1441c9f65b0d5ac868c6f262f2 Mon Sep 17 00:00:00 2001 From: Andrey Somsikov Date: Mon, 5 Jul 2021 18:53:11 +0300 Subject: [PATCH] Add ENABLE_UNDEFINED_BEHAVIOR_SANITIZER option (#6385) Add a configuration for the UndefinedBehavior sanitizer, disabled by default. Refactor sanitizer configuration to split options which are common across sanitizers. Unify sanitizer runtime linkage accross sanitizers to use compiler default. --- .../compile_flags/sanitizer.cmake | 52 ++++++++++--------- cmake/developer_package/features.cmake | 2 + 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/cmake/developer_package/compile_flags/sanitizer.cmake b/cmake/developer_package/compile_flags/sanitizer.cmake index 3e73ef28076..dbf35196507 100644 --- a/cmake/developer_package/compile_flags/sanitizer.cmake +++ b/cmake/developer_package/compile_flags/sanitizer.cmake @@ -5,13 +5,36 @@ include(CheckCXXCompilerFlag) if (ENABLE_SANITIZER) - set(SANITIZER_COMPILER_FLAGS "-g -fsanitize=address -fno-omit-frame-pointer") - CHECK_CXX_COMPILER_FLAG("-fsanitize-recover=address" SANITIZE_RECOVER_SUPPORTED) - if (SANITIZE_RECOVER_SUPPORTED) + set(SANITIZER_COMPILER_FLAGS "${SANITIZER_COMPILER_FLAGS} -fsanitize=address") + CHECK_CXX_COMPILER_FLAG("-fsanitize-recover=address" SANITIZE_RECOVER_ADDRESS_SUPPORTED) + if (SANITIZE_RECOVER_ADDRESS_SUPPORTED) set(SANITIZER_COMPILER_FLAGS "${SANITIZER_COMPILER_FLAGS} -fsanitize-recover=address") endif() - set(SANITIZER_LINKER_FLAGS "-fsanitize=address") + set(SANITIZER_LINKER_FLAGS "${SANITIZER_LINKER_FLAGS} -fsanitize=address") +endif() + +if (ENABLE_UB_SANITIZER) + # TODO: Remove -fno-sanitize=null as thirdparty/ocl/clhpp_headers UBSAN compatibility resolved: + # https://github.com/KhronosGroup/OpenCL-CLHPP/issues/17 + set(SANITIZER_COMPILER_FLAGS "${SANITIZER_COMPILER_FLAGS} -fsanitize=undefined -fno-sanitize=null") + CHECK_CXX_COMPILER_FLAG("-fsanitize-recover=undefined" SANITIZE_RECOVER_UNDEFINED_SUPPORTED) + if (SANITIZE_RECOVER_UNDEFINED_SUPPORTED) + set(SANITIZER_COMPILER_FLAGS "${SANITIZER_COMPILER_FLAGS} -fsanitize-recover=undefined") + endif() + + set(SANITIZER_LINKER_FLAGS "${SANITIZER_LINKER_FLAGS} -fsanitize=undefined") +endif() + +if (ENABLE_THREAD_SANITIZER) + set(SANITIZER_COMPILER_FLAGS "${SANITIZER_COMPILER_FLAGS} -fsanitize=thread") + set(SANITIZER_LINKER_FLAGS "${SANITIZER_LINKER_FLAGS} -fsanitize=thread") +endif() + +# common sanitizer options +if (DEFINED SANITIZER_COMPILER_FLAGS) + # ensure sumbols are present + set(SANITIZER_COMPILER_FLAGS "-g -fno-omit-frame-pointer") # prevent unloading libraries at runtime, so sanitizer can resolve their symbols set(SANITIZER_LINKER_FLAGS "${SANITIZER_LINKER_FLAGS} -Wl,-z,nodelete") @@ -28,23 +51,4 @@ if (ENABLE_SANITIZER) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${SANITIZER_LINKER_FLAGS}") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${SANITIZER_LINKER_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${SANITIZER_LINKER_FLAGS}") -endif() - -if (ENABLE_THREAD_SANITIZER) - set(SANITIZER_COMPILER_FLAGS "-g -fsanitize=thread -fno-omit-frame-pointer") - set(SANITIZER_LINKER_FLAGS "-fsanitize=thread") - set(SANITIZER_LINKER_FLAGS "${SANITIZER_LINKER_FLAGS} -Wl,-z,nodelete") - - if(CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang$" AND NOT WIN32) - if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 8.0) - set(SANITIZER_LINKER_FLAGS "${SANITIZER_LINKER_FLAGS} -fuse-ld=lld") - else() - set(SANITIZER_LINKER_FLAGS "${SANITIZER_LINKER_FLAGS} -static-libsan") - endif() - endif() - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZER_COMPILER_FLAGS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZER_COMPILER_FLAGS}") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${SANITIZER_LINKER_FLAGS}") - set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${SANITIZER_LINKER_FLAGS}") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${SANITIZER_LINKER_FLAGS}") -endif() +endif() \ No newline at end of file diff --git a/cmake/developer_package/features.cmake b/cmake/developer_package/features.cmake index 4a8e5810a24..487dea8c7e3 100644 --- a/cmake/developer_package/features.cmake +++ b/cmake/developer_package/features.cmake @@ -24,6 +24,8 @@ ie_dependent_option (ENABLE_INTEGRITYCHECK "build DLLs with /INTEGRITYCHECK flag ie_option (ENABLE_SANITIZER "enable checking memory errors via AddressSanitizer" OFF) +ie_option (ENABLE_UB_SANITIZER "enable UndefinedBahavior sanitizer" OFF) + ie_option (ENABLE_THREAD_SANITIZER "enable checking data races via ThreadSanitizer" OFF) ie_dependent_option (ENABLE_COVERAGE "enable code coverage" OFF "CMAKE_CXX_COMPILER_ID STREQUAL GNU" OFF)