|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if("${ARROW_USE_ASAN}" AND "${ARROW_USE_TSAN}") |
|
message(SEND_ERROR "Can only enable one of ASAN or TSAN at a time") |
|
endif() |
|
|
|
|
|
|
|
if(${ARROW_USE_ASAN}) |
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" |
|
OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" |
|
OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION |
|
VERSION_GREATER "4.8")) |
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -DADDRESS_SANITIZER") |
|
else() |
|
message(SEND_ERROR "Cannot use ASAN without clang or gcc >= 4.8") |
|
endif() |
|
endif() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(${ARROW_USE_UBSAN}) |
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL |
|
"Clang") |
|
set(CMAKE_CXX_FLAGS |
|
"${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize=alignment,vptr,function,float-divide-by-zero -fno-sanitize-recover=all" |
|
) |
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION |
|
VERSION_GREATER_EQUAL "5.1") |
|
set(CMAKE_CXX_FLAGS |
|
"${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize=alignment,vptr -fno-sanitize-recover=all" |
|
) |
|
else() |
|
message(SEND_ERROR "Cannot use UBSAN without clang or gcc >= 5.1") |
|
endif() |
|
endif() |
|
|
|
|
|
if(${ARROW_USE_TSAN}) |
|
if(NOT |
|
(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" |
|
OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" |
|
OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION |
|
VERSION_GREATER "4.8"))) |
|
message(SEND_ERROR "Cannot use TSAN without clang or gcc >= 4.8") |
|
endif() |
|
|
|
add_definitions("-fsanitize=thread") |
|
|
|
|
|
add_definitions("-DDYNAMIC_ANNOTATIONS_ENABLED") |
|
|
|
|
|
add_definitions("-DTHREAD_SANITIZER") |
|
|
|
|
|
|
|
add_definitions("-D_GLIBCXX_EXTERN_TEMPLATE=0") |
|
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie -fsanitize=thread") |
|
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -pie -fsanitize=thread") |
|
|
|
|
|
|
|
|
|
|
|
if("${ARROW_LINK}" STREQUAL "a") |
|
message(STATUS "Using dynamic linking for TSAN") |
|
set(ARROW_LINK "d") |
|
elseif("${ARROW_LINK}" STREQUAL "s") |
|
message(SEND_ERROR "Cannot use TSAN with static linking") |
|
endif() |
|
endif() |
|
|
|
if(${ARROW_USE_COVERAGE}) |
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL |
|
"Clang") |
|
add_definitions("-fsanitize-coverage=pc-table,inline-8bit-counters,edge,no-prune,trace-cmp,trace-div,trace-gep" |
|
) |
|
|
|
set(CMAKE_CXX_FLAGS |
|
"${CMAKE_CXX_FLAGS} -fsanitize-coverage=pc-table,inline-8bit-counters,edge,no-prune,trace-cmp,trace-div,trace-gep" |
|
) |
|
else() |
|
message(SEND_ERROR "You can only enable coverage with clang") |
|
endif() |
|
endif() |
|
|
|
if("${ARROW_USE_UBSAN}" |
|
OR "${ARROW_USE_ASAN}" |
|
OR "${ARROW_USE_TSAN}") |
|
|
|
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL |
|
"Clang") |
|
set(CMAKE_CXX_FLAGS |
|
"${CMAKE_CXX_FLAGS} -fsanitize-blacklist=${BUILD_SUPPORT_DIR}/sanitizer-disallowed-entries.txt" |
|
) |
|
else() |
|
message(WARNING "GCC does not support specifying a sanitizer disallowed entries list. Known sanitizer check failures will not be suppressed." |
|
) |
|
endif() |
|
endif() |
|
|