details: https://hg.nginx.org/njs/rev/0490f1ae4cf5 branches: changeset: 2258:0490f1ae4cf5 user: Dmitry Volyntsev <xei...@nginx.com> date: Sun Jul 30 10:21:51 2023 +0100 description: Ignoring UndefinedBehaviorSanitizer warnings where appropriate.
Prodded by David Carlier and Ben Kallus. diffstat: auto/clang | 11 +++++++++++ src/njs_clang.h | 25 +++++++++++++++++++++++++ src/njs_number.c | 4 +++- src/njs_number.h | 2 +- src/njs_typed_array.c | 2 +- 5 files changed, 41 insertions(+), 3 deletions(-) diffs (94 lines): diff -r 275d785ab5bf -r 0490f1ae4cf5 auto/clang --- a/auto/clang Mon Jan 08 16:40:42 2024 -0800 +++ b/auto/clang Sun Jul 30 10:21:51 2023 +0100 @@ -161,6 +161,17 @@ njs_feature_test="int main(int argc, cha . auto/feature +njs_feature="GCC __attribute__ no_sanitize" +njs_feature_name=NJS_HAVE_GCC_ATTRIBUTE_NO_SANITIZE +njs_feature_run=no +njs_feature_path= +njs_feature_libs= +njs_feature_test="__attribute__((no_sanitize(\"undefined\"))) int main(void) { + return 0; + }" +. auto/feature + + njs_feature="Address sanitizer" njs_feature_name=NJS_HAVE_ADDRESS_SANITIZER njs_feature_run=no diff -r 275d785ab5bf -r 0490f1ae4cf5 src/njs_clang.h --- a/src/njs_clang.h Mon Jan 08 16:40:42 2024 -0800 +++ b/src/njs_clang.h Sun Jul 30 10:21:51 2023 +0100 @@ -183,6 +183,31 @@ njs_leading_zeros64(uint64_t x) #define njs_msan_unpoison(ptr, size) #endif +#if (NJS_HAVE_GCC_ATTRIBUTE_NO_SANITIZE) +#define NJS_NOSANITIZE(options) __attribute__((no_sanitize(options))) +#else +#define NJS_NOSANITIZE(options) +#endif + + +njs_inline NJS_NOSANITIZE("float-cast-overflow") int64_t +njs_unsafe_cast_double_to_int64(double num) +{ + /* + * Casting NaN to integer is undefined behavior, + * but it is fine in some cases where we do additional checks later. + * For example: + * int64_t i64 = njs_unsafe_cast_double_to_int64(num); + * if (i64 == num) { + * // num is integer + * } + * + * We do this as inline function to avoid UndefinedBehaviorSanitizer + * warnings. + */ + return (int64_t) num; +} + #if (NJS_HAVE_DENORMALS_CONTROL) #include <xmmintrin.h> diff -r 275d785ab5bf -r 0490f1ae4cf5 src/njs_number.c --- a/src/njs_number.c Mon Jan 08 16:40:42 2024 -0800 +++ b/src/njs_number.c Sun Jul 30 10:21:51 2023 +0100 @@ -382,7 +382,9 @@ njs_number_is_safe_integer(njs_vm_t *vm, if (nargs > 1 && njs_is_number(&args[1])) { num = njs_number(&args[1]); - if (num == (int64_t) num && fabs(num) <= NJS_MAX_SAFE_INTEGER) { + if (num == njs_unsafe_cast_double_to_int64(num) + && fabs(num) <= NJS_MAX_SAFE_INTEGER) + { integer = 1; } } diff -r 275d785ab5bf -r 0490f1ae4cf5 src/njs_number.h --- a/src/njs_number.h Mon Jan 08 16:40:42 2024 -0800 +++ b/src/njs_number.h Sun Jul 30 10:21:51 2023 +0100 @@ -36,7 +36,7 @@ njs_int_t njs_number_parse_float(njs_vm_ njs_uint_t nargs, njs_index_t unused, njs_value_t *retval); -njs_inline njs_bool_t +njs_inline NJS_NOSANITIZE("float-cast-overflow") njs_bool_t njs_number_is_integer_index(double num) { uint32_t u32; diff -r 275d785ab5bf -r 0490f1ae4cf5 src/njs_typed_array.c --- a/src/njs_typed_array.c Mon Jan 08 16:40:42 2024 -0800 +++ b/src/njs_typed_array.c Sun Jul 30 10:21:51 2023 +0100 @@ -1388,7 +1388,7 @@ njs_typed_array_prototype_index_of(njs_v v = njs_number(njs_argument(args, 1)); - i64 = v; + i64 = njs_unsafe_cast_double_to_int64(v); integer = (v == i64); buffer = array->buffer; _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel