1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
function(add_sanitizer_flags)
if(NOT ENABLE_SANITIZE_ADDR AND NOT ENABLE_SANITIZE_UNDEF)
return()
endif()
if(CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID MATCHES "GNU")
add_compile_options("-fno-omit-frame-pointer")
add_link_options("-fno-omit-frame-pointer")
if(ENABLE_SANITIZE_ADDR)
add_compile_options("-fsanitize=address")
add_link_options("-fsanitize=address")
endif()
if(ENABLE_SANITIZE_UNDEF)
add_compile_options("-fsanitize=undefined")
add_link_options("-fsanitize=undefined")
endif()
if(ENABLE_SANITIZE_LEAK)
add_compile_options("-fsanitize=leak")
add_link_options("-fsanitize=leak")
endif()
if(ENABLE_SANITIZE_THREAD)
if(ENABLE_SANITIZE_ADDR OR ENABLE_SANITIZE_LEAK)
message(WARNING "thread does not work with: address and leak")
endif()
add_compile_options("-fsanitize=thread")
add_link_options("-fsanitize=thread")
endif()
elseif(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
if(ENABLE_SANITIZE_ADDR)
add_compile_options("/fsanitize=address")
endif()
if(ENABLE_SANITIZE_UNDEF)
message(STATUS "sanitize=undefined not avail. for MSVC")
endif()
if(ENABLE_SANITIZE_LEAK)
message(STATUS "sanitize=leak not avail. for MSVC")
endif()
if(ENABLE_SANITIZE_THREAD)
message(STATUS "sanitize=thread not avail. for MSVC")
endif()
else()
message(WARNING "This sanitizer not supported in this environment (${CMAKE_C_COMPILER_ID})")
return()
endif()
endfunction(add_sanitizer_flags)
|