From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp37.i.mail.ru (smtp37.i.mail.ru [94.100.177.97]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id E2BEA4696F5 for ; Thu, 28 May 2020 02:32:34 +0300 (MSK) From: Vladislav Shpilevoy Date: Thu, 28 May 2020 01:32:22 +0200 Message-Id: <645228196cb289f4bbf8e1df47f17ea958cd9237.1590622225.git.v.shpilevoy@tarantool.org> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH v2 03/10] cmake: add option ENABLE_UB_SANITIZER List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tarantool-patches@dev.tarantool.org, alyapunov@tarantool.org, korablev@tarantool.org, tsafin@tarantool.org Clang has a built-in sanitizer for undefined behaviour. Such as wrong memory alignment, array boundaries violation, 0 division, bool values with non standard content, etc. The sanitizer emits runtime checks which lead to either crash, or a trap, or a warning print, depending on what is chosen. The patch makes it possible to turn the sanitizer on and catch UBs. The only supported UB so far is alignment check. Other types can be added gradually, along with fixing bugs which they find. The UB sanitizer is activated for ASAN builds in CI. Part of #4609 --- .travis.mk | 3 ++- cmake/compiler.cmake | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.travis.mk b/.travis.mk index 063537f25..748321f26 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/cmake/compiler.cmake b/cmake/compiler.cmake index ce3e7e506..373bcd3b0 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") -- 2.21.1 (Apple Git-122.3)