123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- function(enable_sanitizers project_name)
- if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")
- option(ENABLE_COVERAGE "Enable coverage reporting for gcc/clang" FALSE)
- if(ENABLE_COVERAGE)
- target_compile_options(${project_name} INTERFACE --coverage -O0 -g)
- target_link_libraries(${project_name} INTERFACE --coverage)
- endif()
- set(SANITIZERS "")
- option(ENABLE_SANITIZER_ADDRESS "Enable address sanitizer" FALSE)
- if(ENABLE_SANITIZER_ADDRESS)
- list(APPEND SANITIZERS "address")
- endif()
- option(ENABLE_SANITIZER_LEAK "Enable leak sanitizer" FALSE)
- if(ENABLE_SANITIZER_LEAK)
- list(APPEND SANITIZERS "leak")
- endif()
- option(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR "Enable undefined behavior sanitizer" FALSE)
- if(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR)
- list(APPEND SANITIZERS "undefined")
- endif()
- option(ENABLE_SANITIZER_THREAD "Enable thread sanitizer" FALSE)
- if(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()
- option(ENABLE_SANITIZER_MEMORY "Enable memory sanitizer" FALSE)
- if(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
- "")
- target_compile_options(${project_name} INTERFACE -fsanitize=${LIST_OF_SANITIZERS})
- target_link_libraries(${project_name} INTERFACE -fsanitize=${LIST_OF_SANITIZERS})
- endif()
- endif()
- endfunction()
|