From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> To: tarantool-patches@dev.tarantool.org, korablev@tarantool.org, tsafin@tarantool.org, alyapunov@tarantool.org, gorcunov@gmail.com Subject: [Tarantool-patches] [PATCH 03/10] cmake: add option ENABLE_UB_SANITIZER Date: Thu, 21 May 2020 22:37:26 +0200 [thread overview] Message-ID: <2e24204c8064d0c81e1baf81e9e23247199d083f.1590093222.git.v.shpilevoy@tarantool.org> (raw) In-Reply-To: <cover.1590093222.git.v.shpilevoy@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. Sometimes it happens that unaligned memory access is done intentionally, or can't be simply fixed. To disable the sanitizer for such places an attribute 'no_sanitize' can be used. It is added inside a macro NOSANITIZE_ALIGN. Part of #4609 --- cmake/compiler.cmake | 10 ++++++++++ src/trivia/util.h | 6 ++++++ 2 files changed, 16 insertions(+) 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") diff --git a/src/trivia/util.h b/src/trivia/util.h index 8a3d22b38..466cb6e55 100644 --- a/src/trivia/util.h +++ b/src/trivia/util.h @@ -392,6 +392,12 @@ strnindex(const char **haystack, const char *needle, uint32_t len, uint32_t hmax /** \endcond public */ +#if __has_attribute(no_sanitize) +#define NOSANITIZE_ALIGN __attribute__((no_sanitize("alignment"))) +#else +#define NOSANITIZE_ALIGN +#endif + void close_all_xcpt(int fdc, ...); void __gcov_flush(); -- 2.21.1 (Apple Git-122.3)
next prev parent reply other threads:[~2020-05-21 20:37 UTC|newest] Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-05-21 20:37 [Tarantool-patches] [PATCH 00/10] Sanitize unaligned access Vladislav Shpilevoy 2020-05-21 20:37 ` [Tarantool-patches] [PATCH 01/10] small: sanitized rlist and new region API Vladislav Shpilevoy 2020-06-08 12:17 ` Cyrill Gorcunov 2020-05-21 20:37 ` [Tarantool-patches] [PATCH 10/10] xrow: use unaligned store operation in xrow_to_iovec() Vladislav Shpilevoy 2020-06-08 12:26 ` Cyrill Gorcunov 2020-05-21 20:37 ` [Tarantool-patches] [PATCH 02/10] cmake: ignore warnings on alignof() and offsetof() Vladislav Shpilevoy 2020-06-08 12:52 ` Cyrill Gorcunov 2020-05-21 20:37 ` Vladislav Shpilevoy [this message] 2020-06-08 12:53 ` [Tarantool-patches] [PATCH 03/10] cmake: add option ENABLE_UB_SANITIZER Cyrill Gorcunov 2020-05-21 20:37 ` [Tarantool-patches] [PATCH 04/10] crc32: disable align sanitizer Vladislav Shpilevoy 2020-06-08 13:58 ` Cyrill Gorcunov 2020-05-21 20:37 ` [Tarantool-patches] [PATCH 05/10] sql: make BtCursor's memory aligned Vladislav Shpilevoy 2020-06-08 13:58 ` Cyrill Gorcunov 2020-05-21 20:37 ` [Tarantool-patches] [PATCH 06/10] region: use aligned allocations where necessary Vladislav Shpilevoy 2020-06-08 14:00 ` Cyrill Gorcunov 2020-05-21 20:37 ` [Tarantool-patches] [PATCH 07/10] vinyl: align statements and bps tree extents Vladislav Shpilevoy 2020-06-08 14:02 ` Cyrill Gorcunov 2020-05-21 20:37 ` [Tarantool-patches] [PATCH 08/10] tuple: use unaligned store-load for field map Vladislav Shpilevoy 2020-06-08 14:04 ` Cyrill Gorcunov 2020-05-21 20:37 ` [Tarantool-patches] [PATCH 09/10] port: make port_c_entry not PACKED Vladislav Shpilevoy 2020-06-08 14:04 ` Cyrill Gorcunov 2020-05-21 22:25 ` [Tarantool-patches] [PATCH 00/10] Sanitize unaligned access Sergey Bronnikov 2020-05-27 23:33 ` Vladislav Shpilevoy
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=2e24204c8064d0c81e1baf81e9e23247199d083f.1590093222.git.v.shpilevoy@tarantool.org \ --to=v.shpilevoy@tarantool.org \ --cc=alyapunov@tarantool.org \ --cc=gorcunov@gmail.com \ --cc=korablev@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --cc=tsafin@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH 03/10] cmake: add option ENABLE_UB_SANITIZER' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox