[erlang-patches] [PATCH] correct conversion of MIN_SMALL numeral to fixnum

Mikael Pettersson mikpelinux@REDACTED
Wed Aug 20 09:53:52 CEST 2014


Conversion of MIN_SMALL as a numeral to an Erlang integer, via
binary_to_integer/1 or list_to_integer/1, succeeds but creates
the integer as a negative bignum.  This is incorrect as (a) the
value fits in a fixnum, and (b) the VM expects values that fit
in fixnums to also be fixnums.  The bug is that the numeral is
converted first as a non-negative number, and then finally
negated if prefixed by a unary minus sign.  MIN_SMALL without
the sign is MAX_SMALL+1, which doesn't fit in a fixnum, so the
value before the negation is a bignum.  To correct the
representation after the negation call big_plus_small with zero,
as already done in other places.

Tested with the emulator testsuite on Linux/x86_64, no regressions.

Thanks to Jesper Louis Andersen for the report to erlang-bugs.

Signed-off-by: Mikael Pettersson <mikpelinux@REDACTED>

Links:

git fetch git://github.com/mikpe/otp.git MIN_SMALL-to-integer

https://github.com/mikpe/otp/compare/erlang:maint...MIN_SMALL-to-integer
https://github.com/mikpe/otp/compare/erlang:maint...MIN_SMALL-to-integer.patch

https://github.com/erlang/otp/pull/452



More information about the erlang-patches mailing list