]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Do not call log10(0.0) in std::format [PR110860]
authorJonathan Wakely <jwakely@redhat.com>
Fri, 11 Aug 2023 17:10:29 +0000 (18:10 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Fri, 11 Aug 2023 17:20:48 +0000 (18:20 +0100)
Calling log10(0.0) returns -inf which has undefined behaviour when
converted to an integer. We only need to use log10 for large values
anyway. If the value is zero then the larger buffer is only needed due
to a large precision, so we don't need to use log10 to estimate the
number of digits for the significand.

libstdc++-v3/ChangeLog:

PR libstdc++/110860
* include/std/format (__formatter_fp::format): Do not call log10
with zero values.

libstdc++-v3/include/std/format

index 2fe430f75f69bf9419489357c28b523615214a9a..23da6b008c5db7092853cd9511a594b5d724ab56 100644 (file)
@@ -1490,7 +1490,7 @@ namespace __format
              // If the buffer is too small it's probably because of a large
              // precision, or a very large value in fixed format.
              size_t __guess = 8 + __prec;
-             if (__fmt == chars_format::fixed) // +ddd.prec
+             if (__fmt == chars_format::fixed && __v != 0) // +ddd.prec
                {
                  if constexpr (is_same_v<_Fp, float>)
                    __guess += __builtin_log10f(__v < 0.0f ? -__v : __v);