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(SANITIZE_ADDRESS "Enable address sanitizer" FALSE)
    if(SANITIZE_ADDRESS)
      list(APPEND SANITIZERS "address")
    endif()

    option(SANITIZE_MEMORY "Enable memory sanitizer" FALSE)
    if(SANITIZE_MEMORY)
      list(APPEND SANITIZERS "memory")
    endif()

    option(SANITIZE_UNDEFINED_BEHAVIOR
           "Enable undefined behavior sanitizer" FALSE)
    if(SANITIZE_UNDEFINED_BEHAVIOR)
      list(APPEND SANITIZERS "undefined")
    endif()

    option(SANITIZE_THREAD "Enable thread sanitizer" FALSE)
    if(SANITIZE_THREAD)
      list(APPEND SANITIZERS "thread")
    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()
