[erlang-bugs] Problem with binary_to_integer/1 and list_to_integer/1 (QuickCheck test case)

Lukas Larsson lukas@REDACTED
Mon Aug 18 14:44:08 CEST 2014


Hello Jesper,

There seems to be a bug in the generic c-code for binary/list_to_integer 
for that specific value where a bignum is returned when a small should 
have been returned. If no-one feels like submitting a patch to fix it, 
I'll take a look later this week.

Thanks for the bug report!

Lukas
On 18/08/14 14:36, Jesper Louis Andersen wrote:
> Hi,
>
> While working on transit-erlang, Isaiah Peng and I found what we 
> believe to be a bug in the Erlang compiler:
>
> 9> A = -576460752303423488.
> -576460752303423488
> 10> B = binary_to_integer(integer_to_binary(A)).
> -576460752303423488
> 11> A == B.
> false
> 12> A.
> -576460752303423488
> 13> B.
> -576460752303423488
> 14>
>
> I expected command 11 (A == B) to return true, as the numbers are the 
> same. But it looks like constants are not treated the same way as 
> converted vaues for some reason and the equality test fails.
>
> This fails in the interpreter and in compiled code. It *also* fails 
> with list_to_integer/1 and integer_to_list/1.  The number is not 
> chosen arbitrarily. It is -1 * 2^59 which is a borderline number on a 
> 64bit machine. (OTP release 17.1). Isaiah notes that these borderline 
> numbers are not caught by the OTP test cases. They probably should be.
>
> In the interest of full exploration, I've written a QuickCheck test 
> case to catch the remaining trouble. It explicitly tests the 
> borderline numbers and only finds this error.
>
> https://gist.github.com/jlouis/52b68d9d4150af3bd00c
>
> -module(integer_coding).
>
> -compile(export_all).
>
> -include_lib("eqc/include/eqc.hrl").
>
> power(_N, 0) -> 1;
> power(N, P) -> N * power(N, P-1).
>
> perturb() ->
>      elements([0, 1, -1, 2, -2, 3, -3, 4, -4, 5, -5]).
>
> sign() ->
>      elements([1, -1]).
>
> nat_power() ->
>      frequency([{1, elements([27, 28, 29, 31, 32, 33, 59, 60, 61, 63, 64, 65])},
>                 {1, nat()}]).
>
> interesting_int() ->
>      ?LET({K, Sign, Perturb}, {nat_power(), sign(), perturb()},
>        power(2, K)*Sign + Perturb).
>
> prop_binary_iso() ->
>      ?FORALL(K, interesting_int(),
>              begin
>                  I = binary_to_integer(integer_to_binary(K)),
>                  I == K
>              end).
>
> prop_list_iso() ->
>      ?FORALL(K, interesting_int(),
>              begin
>                  I = list_to_integer(integer_to_list(K)),
>                  I == K
>              end).
>
> all() ->
>      eqc:module({numtests, 3000}, ?MODULE).
>
> t() ->
>      eqc:quickcheck(eqc:testing_time(300, prop_binary_iso())).
>
>
> [...]
>
> Produces:
>
> 8> integer_coding:all().
> prop_list_iso: .........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................Failed! After 1498 tests.
> -576460752303423488
> prop_binary_iso: ...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................Failed! After 588 tests.
> -576460752303423488
> [prop_list_iso,prop_binary_iso]
> 9>
>
> -- 
> J.
>
>
> _______________________________________________
> erlang-bugs mailing list
> erlang-bugs@REDACTED
> http://erlang.org/mailman/listinfo/erlang-bugs

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20140818/898bae52/attachment.htm>


More information about the erlang-bugs mailing list