diff --git a/cmake/compiler.cmake b/cmake/compiler.cmake index 12e94cfd007e7ec2d00722ea0dc6d272a30cf67d..9b8c317e0cbb1bba7f69c6eca1f2e3a1bda699cf 100644 --- a/cmake/compiler.cmake +++ b/cmake/compiler.cmake @@ -246,9 +246,6 @@ macro(enable_tnt_compile_flags) object-size # See https://github.com/tarantool/tarantool/issues/10742. pointer-overflow - # Integer overflow and truncation are disabled due to extensive - # usage of this UB in SQL code to 'implement' some kind of int65_t. - signed-integer-overflow # NULL checking is disabled, because this is not a UB and raises # lots of false-positive fails such as typeof(*obj) with # obj == NULL, or memcpy() with NULL argument and 0 size. diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c index 95844b76c7490a354b597b2b0aade2049184ca28..b5aa42ff1e87cc2262165f82388aeac1a8decfec 100644 --- a/src/box/sql/expr.c +++ b/src/box/sql/expr.c @@ -3166,6 +3166,11 @@ expr_code_dec(struct Parse *parser, struct Expr *expr, bool is_neg, int reg) * @param neg_flag True if value is negative. * @param mem Register to store parsed integer */ +#if ENABLE_UB_SANITIZER +static void +expr_code_int(struct Parse *parse, struct Expr *expr, bool is_neg, int mem) +__attribute__((no_sanitize("signed-integer-overflow"))); +#endif static void expr_code_int(struct Parse *parse, struct Expr *expr, bool is_neg, int mem) diff --git a/src/box/sql/func.c b/src/box/sql/func.c index 3aa29f419fc27572e0b6b8db4c7ac5c44c85f5d4..8df4338400231df3747c036bd6c45493655245d3 100644 --- a/src/box/sql/func.c +++ b/src/box/sql/func.c @@ -234,6 +234,11 @@ step_group_concat(struct sql_context *ctx, int argc, const struct Mem *argv) } /** Implementations of the ABS() function. */ +#if ENABLE_UB_SANITIZER +static void +func_abs_int(struct sql_context *ctx, int argc, const struct Mem *argv) + __attribute__((no_sanitize("signed-integer-overflow"))); +#endif static void func_abs_int(struct sql_context *ctx, int argc, const struct Mem *argv) { diff --git a/src/box/sql/util.c b/src/box/sql/util.c index 7e6826976a0d03b2b3ad45cb7d7cefb16798ffb1..3dfb28a0878dc7b42142cf824fd7d9086f261d7d 100644 --- a/src/box/sql/util.c +++ b/src/box/sql/util.c @@ -820,6 +820,13 @@ sqlHexToBlob(const char *z, int n) return zBlob; } +#if ENABLE_UB_SANITIZER +/* See https://github.com/tarantool/tarantool/issues/10703. */ +int +sql_add_int(int64_t lhs, bool is_lhs_neg, int64_t rhs, bool is_rhs_neg, + int64_t *res, bool *is_res_neg) + __attribute__((no_sanitize("signed-integer-overflow"))); +#endif int sql_add_int(int64_t lhs, bool is_lhs_neg, int64_t rhs, bool is_rhs_neg, int64_t *res, bool *is_res_neg) @@ -849,6 +856,13 @@ sql_add_int(int64_t lhs, bool is_lhs_neg, int64_t rhs, bool is_rhs_neg, return 0; } +#if ENABLE_UB_SANITIZER +/* See https://github.com/tarantool/tarantool/issues/10703. */ +int +sql_sub_int(int64_t lhs, bool is_lhs_neg, int64_t rhs, bool is_rhs_neg, + int64_t *res, bool *is_res_neg) + __attribute__((no_sanitize("signed-integer-overflow"))); +#endif int sql_sub_int(int64_t lhs, bool is_lhs_neg, int64_t rhs, bool is_rhs_neg, int64_t *res, bool *is_res_neg) @@ -934,6 +948,13 @@ sql_mul_int(int64_t lhs, bool is_lhs_neg, int64_t rhs, bool is_rhs_neg, return 0; } +#if ENABLE_UB_SANITIZER +/* See https://github.com/tarantool/tarantool/issues/10703. */ +int +sql_div_int(int64_t lhs, bool is_lhs_neg, int64_t rhs, bool is_rhs_neg, + int64_t *res, bool *is_res_neg) + __attribute__((no_sanitize("signed-integer-overflow"))); +#endif int sql_div_int(int64_t lhs, bool is_lhs_neg, int64_t rhs, bool is_rhs_neg, int64_t *res, bool *is_res_neg) diff --git a/src/lib/core/datetime.c b/src/lib/core/datetime.c index 22b7705910d6d65cddc20f26ba46c6523aacd38d..6ee0b752eed2641633e36937fadbf06c92eb959e 100644 --- a/src/lib/core/datetime.c +++ b/src/lib/core/datetime.c @@ -34,6 +34,12 @@ * since Rata Die (0001-01-01). * DT_EPOCH_1970_OFFSET is the distance in days from Rata Die to Epoch. */ +#if ENABLE_UB_SANITIZER +/* See https://github.com/tarantool/tarantool/issues/10704. */ +static int +local_dt(int64_t secs) + __attribute__((no_sanitize("signed-integer-overflow"))); +#endif static int local_dt(int64_t secs) { diff --git a/src/lib/core/fiber.c b/src/lib/core/fiber.c index b5782d9784db9de7a449280e55d7b42a6acbaeb2..445525b5be758d77b91a136b04ecda5ba90a450e 100644 --- a/src/lib/core/fiber.c +++ b/src/lib/core/fiber.c @@ -276,6 +276,11 @@ static __thread bool fiber_parent_backtrace_enabled; * An action performed each time a context switch happens. * Used to count each fiber's processing time. */ +#if ENABLE_UB_SANITIZER +static inline void +clock_set_on_csw(struct fiber *caller) + __attribute__((no_sanitize("signed-integer-overflow"))); +#endif static inline void clock_set_on_csw(struct fiber *caller) { diff --git a/src/trivia/config.h.cmake b/src/trivia/config.h.cmake index dfdb9129d6ec47244ae4ed0baf417f4864758339..f3ddd3cc3075804006457779729e41301cdb9356 100644 --- a/src/trivia/config.h.cmake +++ b/src/trivia/config.h.cmake @@ -273,6 +273,7 @@ #define DEFAULT_CFG SYSCONF_DIR "/" DEFAULT_CFG_FILENAME #cmakedefine ENABLE_ASAN 1 +#cmakedefine ENABLE_UB_SANITIZER 1 /* Cacheline size to calculate alignments */ #define CACHELINE_SIZE 64