-
Notifications
You must be signed in to change notification settings - Fork 15.3k
Open
Labels
Description
The unit tests fail with gcc-14:
In file included from /android0/llvm-project/libc/test/src/__support/high_precision_decimal_test.cpp:9:
In member function ‘bool __llvm_libc_20_0_0_git::internal::HighPrecisionDecimal::should_round_up(int32_t, __llvm_libc_20_0_0_git::internal::RoundDirection)’,
inlined from ‘T __llvm_libc_20_0_0_git::internal::HighPrecisionDecimal::round_to_integer_type(__llvm_libc_20_0_0_git::internal::RoundDirection) [with T = long unsigned int]’ at /android0/llvm-project/libc/src/__support/high_precision_decimal.h:428:46,
inlined from ‘virtual void LlvmLibcHighPrecisionDecimalTest_NumLenDigitsTest::Run()’ at /android0/llvm-project/libc/test/src/__support/high_precision_decimal_test.cpp:435:3:
/android0/llvm-project/libc/src/__support/high_precision_decimal.h:150:36: error: ‘longer_hpd’ may be used uninitialized [-Werror=maybe-uninitialized]
150 | if (this->digits[round_to_digit] == 5 &&
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
/android0/llvm-project/libc/test/src/__support/high_precision_decimal_test.cpp: In member function ‘virtual void LlvmLibcHighPrecisionDecimalTest_NumLenDigitsTest::Run()’:
/android0/llvm-project/libc/test/src/__support/high_precision_decimal_test.cpp:431:50: note: ‘longer_hpd’ declared here
431 | LIBC_NAMESPACE::internal::HighPrecisionDecimal longer_hpd =
| ^~~~~~~~~~
In this case, I think GCC is correct. The constructor for HighPrecisionDecimal doesn't guarantee that its digits member is fully initialized, so constructing an object then calling round_to_integer_type may end up reading uninitialized memory (UB). I think the constructor of HighPrecisionDecimal should unconditionally initialize digits. Found while trying to test #124036.