Commit f97b156e authored by Marcus Holland-Moritz's avatar Marcus Holland-Moritz Committed by Facebook Github Bot 3

Fix undefined behaviour in 128-bit integer-to-string conversion

Summary:
The code to convert signed 128-bit integer values to strings would trigger
undefined behaviour when trying to convert the most negative possible value,
as exposed by the new test cases.

The fix is to negate the corresponding unsigned value (just like it's already
done for the 64-bit code).

This change doesn't have any performance impact.

Reviewed By: yfeldblum

Differential Revision: D3455817

fbshipit-source-id: 83782992324f443789760a0e61cd9b889faaf317
parent 05a4c221
......@@ -461,7 +461,7 @@ toAppend(__int128 value, Tgt * result) {
size_t p;
if (value < 0) {
p = detail::unsafeTelescope128(buffer, sizeof(buffer), Usrc(-value));
p = detail::unsafeTelescope128(buffer, sizeof(buffer), -Usrc(value));
buffer[--p] = '-';
} else {
p = detail::unsafeTelescope128(buffer, sizeof(buffer), value);
......
......@@ -197,6 +197,15 @@ void test128Bit2String() {
svalue = 0;
EXPECT_EQ(to<String>(svalue), "0");
value = ~__int128(0);
EXPECT_EQ(to<String>(value), "340282366920938463463374607431768211455");
svalue = -(Uint(1) << 127);
EXPECT_EQ(to<String>(svalue), "-170141183460469231731687303715884105728");
svalue = (Uint(1) << 127) - 1;
EXPECT_EQ(to<String>(svalue), "170141183460469231731687303715884105727");
// TODO: the following do not compile to<__int128> ...
#if 0
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment