diff --git a/.travis.mk b/.travis.mk index 063537f2575cf883e0928924ee2995dda52fcc37..748321f2624899bb9c3b9fee50d83961e655ae02 100644 --- a/.travis.mk +++ b/.travis.mk @@ -114,7 +114,8 @@ coverage_debian: deps_debian test_coverage_debian_no_deps build_asan_debian: CC=clang-8 CXX=clang++-8 cmake . -DCMAKE_BUILD_TYPE=RelWithDebInfo \ - -DENABLE_WERROR=ON -DENABLE_ASAN=ON ${CMAKE_EXTRA_PARAMS} + -DENABLE_WERROR=ON -DENABLE_ASAN=ON -DENABLE_UB_SANITIZER=ON \ + ${CMAKE_EXTRA_PARAMS} make -j test_asan_debian_no_deps: build_asan_debian diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d80b6806a9e5ec0aaa87db09bf00a211a8c2db0..e49317f8a12a917c134d5a6a4149a2a8bfdf8434 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -571,7 +571,7 @@ set(PREFIX ${CMAKE_INSTALL_PREFIX}) set(options PACKAGE VERSION BUILD C_COMPILER CXX_COMPILER C_FLAGS CXX_FLAGS PREFIX ENABLE_SSE2 ENABLE_AVX - ENABLE_GCOV ENABLE_GPROF ENABLE_VALGRIND ENABLE_ASAN + ENABLE_GCOV ENABLE_GPROF ENABLE_VALGRIND ENABLE_ASAN ENABLE_UB_SANITIZER ENABLE_BACKTRACE ENABLE_DOC ENABLE_DIST diff --git a/cmake/compiler.cmake b/cmake/compiler.cmake index b0908f3b3ca2d2811e3ef5d576c9c92c49404679..4b23d6631b2234150ffdfbbafdd08648e28e22d7 100644 --- a/cmake/compiler.cmake +++ b/cmake/compiler.cmake @@ -238,6 +238,8 @@ endif() option(ENABLE_WERROR "Make all compiler warnings into errors" OFF) +option(ENABLE_UB_SANITIZER "Make the compiler generate runtime code to perform undefined behaviour checks" OFF) + macro(enable_tnt_compile_flags) # Tarantool code is written in GNU C dialect. # Additionally, compile it with more strict flags than the rest @@ -263,6 +265,14 @@ macro(enable_tnt_compile_flags) "-Wno-strict-aliasing" ) + if (ENABLE_UB_SANITIZER) + if (NOT CMAKE_COMPILER_IS_CLANG) + message(FATAL_ERROR "Undefined behaviour sanitizer only available for clang") + else() + add_compile_flags("C;CXX" "-fsanitize=alignment -fno-sanitize-recover=alignment") + endif() + endif() + if (CMAKE_COMPILER_IS_CLANG AND CC_HAS_WNO_UNUSED_VALUE) # False-positive warnings for ({ xx = ...; x; }) macroses add_compile_flags("C;CXX" "-Wno-unused-value")