[libc-commits] [PATCH] D148545: [libc] Fix strtod hex exponent overflow bug
Michael Jones via Phabricator via libc-commits
libc-commits at lists.llvm.org
Mon Apr 17 10:33:23 PDT 2023
michaelrj created this revision.
michaelrj added reviewers: lntue, sivachandra.
Herald added subscribers: libc-commits, ecnelises, tschuett.
Herald added projects: libc-project, All.
michaelrj requested review of this revision.
Same issue as was fixed in commit 3d95323 <https://reviews.llvm.org/rG3d953234fede3cb0532c876fd4ba9ea4d89fbd7c>, but for hexadecimal floats.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D148545
Files:
libc/src/__support/str_to_float.h
libc/test/src/stdlib/strtod_test.cpp
Index: libc/test/src/stdlib/strtod_test.cpp
===================================================================
--- libc/test/src/stdlib/strtod_test.cpp
+++ libc/test/src/stdlib/strtod_test.cpp
@@ -226,6 +226,9 @@
"200000000000000000E608",
1462, uint64_t(0x7ff0000000000000), ERANGE);
+ // Same as above but for hex.
+ run_test("0x0164810157p2047", 17, uint64_t(0x7ff0000000000000), ERANGE);
+
// This bug was in the handling of very large exponents in the exponent
// marker. Previously anything greater than 10,000 would be set to 10,000.
// This caused incorrect behavior if there were more than 10,000 '0's in the
Index: libc/src/__support/str_to_float.h
===================================================================
--- libc/src/__support/str_to_float.h
+++ libc/src/__support/str_to_float.h
@@ -1052,13 +1052,12 @@
// If the result is in the valid range, then we use it. The valid range is
// also within the int32 range, so this prevents overflow issues.
- if (temp_exponent < fputil::FPBits<T>::MAX_EXPONENT &&
- temp_exponent > -fputil::FPBits<T>::MAX_EXPONENT) {
- exponent = static_cast<int32_t>(temp_exponent);
- } else if (temp_exponent > fputil::FPBits<T>::MAX_EXPONENT) {
+ if (temp_exponent > fputil::FPBits<T>::MAX_EXPONENT) {
exponent = fputil::FPBits<T>::MAX_EXPONENT;
- } else {
+ } else if (temp_exponent < -fputil::FPBits<T>::MAX_EXPONENT) {
exponent = -fputil::FPBits<T>::MAX_EXPONENT;
+ } else {
+ exponent = static_cast<int32_t>(temp_exponent);
}
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D148545.514299.patch
Type: text/x-patch
Size: 1611 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libc-commits/attachments/20230417/2576da98/attachment.bin>
More information about the libc-commits
mailing list