You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Sanitizer.cmake 3.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # Ported from Clickhouse: https://github.com/ClickHouse/ClickHouse/blob/master/cmake/sanitize.cmake
  2. option (SANITIZE "Enable sanitizer: address, memory, undefined, leak (comma separated list)" "")
  3. set (SAN_FLAGS "${SAN_FLAGS} -g -fno-omit-frame-pointer -DSANITIZER")
  4. # O1 is normally set by clang, and -Og by gcc
  5. if (COMPILER_GCC)
  6. if (ENABLE_FULL_DEBUG MATCHES "ON")
  7. set (SAN_FLAGS "${SAN_FLAGS} -O0")
  8. else()
  9. set (SAN_FLAGS "${SAN_FLAGS} -Og")
  10. endif()
  11. else ()
  12. if (ENABLE_FULL_DEBUG MATCHES "ON")
  13. set (SAN_FLAGS "${SAN_FLAGS} -O0")
  14. else()
  15. set (SAN_FLAGS "${SAN_FLAGS} -O1")
  16. endif()
  17. endif ()
  18. if (SANITIZE)
  19. if (ENABLE_JEMALLOC MATCHES "ON")
  20. message (STATUS "Jemalloc support is useless in case of build with sanitizers")
  21. set (ENABLE_JEMALLOC "OFF")
  22. endif ()
  23. string(REPLACE "," ";" SANITIZE_LIST ${SANITIZE})
  24. foreach(SANITIZE ${SANITIZE_LIST})
  25. if (SANITIZE STREQUAL "address")
  26. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize-address-use-after-scope")
  27. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fsanitize-address-use-after-scope")
  28. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address -fsanitize-address-use-after-scope")
  29. if (COMPILER_GCC)
  30. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libasan")
  31. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libasan")
  32. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libasan")
  33. endif ()
  34. elseif (SANITIZE STREQUAL "leak")
  35. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=leak")
  36. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=leak")
  37. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=leak")
  38. elseif (SANITIZE STREQUAL "memory")
  39. set (MSAN_FLAGS "-fsanitize=memory -fsanitize-memory-track-origins -fno-optimize-sibling-calls")
  40. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MSAN_FLAGS}")
  41. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MSAN_FLAGS}")
  42. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=memory")
  43. if (COMPILER_GCC)
  44. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libmsan")
  45. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libmsan")
  46. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libmsan")
  47. endif ()
  48. elseif (SANITIZE STREQUAL "undefined")
  49. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all")
  50. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all")
  51. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined")
  52. if (COMPILER_GCC)
  53. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libubsan")
  54. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libubsan")
  55. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libubsan")
  56. endif ()
  57. else ()
  58. message (FATAL_ERROR "Unknown sanitizer type: ${SANITIZE}")
  59. endif ()
  60. endforeach ()
  61. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SAN_FLAGS}")
  62. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SAN_FLAGS}")
  63. message (STATUS "Add sanitizer: ${SANITIZE}")
  64. # Disable sanitizing on make stage e.g. for snowball compiler
  65. set (ENV{ASAN_OPTIONS} "detect_leaks=0")
  66. message (STATUS "Sanitizer CFLAGS: ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
  67. message (STATUS "Sanitizer CXXFLAGS: ${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
  68. endif()