function(enable_sanitizers project_name) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") set(SANITIZERS "") if(VF_ENABLE_SANITIZER_ADDRESS) list(APPEND SANITIZERS "address") endif() if(VF_ENABLE_SANITIZER_LEAK) list(APPEND SANITIZERS "leak") endif() if(VF_ENABLE_SANITIZER_UNDEFINED_BEHAVIOR) list(APPEND SANITIZERS "undefined") endif() if(VF_ENABLE_SANITIZER_THREAD) if("address" IN_LIST SANITIZERS OR "leak" IN_LIST SANITIZERS) message(WARNING "Thread sanitizer does not work with Address and Leak sanitizer enabled") else() list(APPEND SANITIZERS "thread") endif() endif() if(VF_ENABLE_SANITIZER_MEMORY AND CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") if("address" IN_LIST SANITIZERS OR "thread" IN_LIST SANITIZERS OR "leak" IN_LIST SANITIZERS) message(WARNING "Memory sanitizer does not work with Address, Thread and Leak sanitizer enabled") else() list(APPEND SANITIZERS "memory") endif() endif() list( JOIN SANITIZERS "," LIST_OF_SANITIZERS) endif() if(LIST_OF_SANITIZERS) if(NOT "${LIST_OF_SANITIZERS}" STREQUAL "") message(STATUS "Enabling sanitizers: ${LIST_OF_SANITIZERS}") target_compile_options(${project_name} INTERFACE -fsanitize=${LIST_OF_SANITIZERS}) # From cmake 3.18 the LINK_OPTIONS and INTERFACE_LINK_OPTIONS target properties are now used for the device link step # https://cmake.org/cmake/help/latest/release/3.18.html # Thats why we are using a generator expression to only add the sanitizers to the host link step. target_link_options(${project_name} INTERFACE "$<HOST_LINK:-fsanitize=$<JOIN:${LIST_OF_SANITIZERS},;>>") endif() endif() endfunction()