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.6KB

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