diff options
-rw-r--r-- | CMakeLists.txt | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index e52a9c41..78871cb2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -168,12 +168,13 @@ else () endif () set(USE_SANITIZER FALSE) + function(SANITIZER NAME FLAGS) if (${NAME}) if (USE_SANITIZER) message(FATAL_ERROR "Only one sanitizer allowed") endif() - set(USE_SANITIZER TRUE) + set(USE_SANITIZER TRUE PARENT_SCOPE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAGS}" PARENT_SCOPE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAGS}" PARENT_SCOPE) endif () @@ -182,8 +183,22 @@ SANITIZER(USE_ASAN "-fsanitize=address") SANITIZER(USE_MSAN "-fsanitize=memory") SANITIZER(USE_LSAN "-fsanitize=leak") -set(UBSAN_BLACKLIST ${WABT_SOURCE_DIR}/ubsan.blacklist) -SANITIZER(USE_UBSAN "-fsanitize=undefined -fno-sanitize-recover -fsanitize-blacklist=${UBSAN_BLACKLIST}") +if (USE_UBSAN) + # -fno-sanitize-recover was deprecated, see if we are compiling with a newer + # clang that requires -fno-sanitize-recover=all. + include(CheckCCompilerFlag) + CHECK_CXX_COMPILER_FLAG("-fsanitize=undefined -fno-sanitize-recover -Wall -Werror" HAS_UBSAN_RECOVER_BARE) + if (HAS_UBSAN_RECOVER_BARE) + SANITIZER(USE_UBSAN "-fsanitize=undefined -fno-sanitize-recover -fsanitize-blacklist=${UBSAN_BLACKLIST}") + endif() + CHECK_CXX_COMPILER_FLAG("-fsanitize=undefined -fno-sanitize-recover=all -Wall -Werror" HAS_UBSAN_RECOVER_ALL) + if (HAS_UBSAN_RECOVER_ALL) + SANITIZER(USE_UBSAN "-fsanitize=undefined -fno-sanitize-recover=all -fsanitize-blacklist=${UBSAN_BLACKLIST}") + endif () + if (NOT USE_SANITIZER) + message(FATAL_ERROR "UBSAN is not supported") + endif () +endif () set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${WABT_SOURCE_DIR}/cmake) find_package(RE2C) |