[erlang-bugs] 2#1 bsl N Crashes Erlang (x86_64)
Daniel Hedlund
daniel@REDACTED
Sun Feb 1 10:31:00 CET 2009
This bug affects x86_64 implementations. Not sure if it's OS specific
or affects other 64-bit architectures. 2#1 bsl N crashes Erlang when
N is larger than available memory but lower than 2^59. Above 2^59, a
bad argument exception occurs.
It appears there's supposed to be a check that prevents insanely large
values of N, starting at 2^25-64 (64-bit) and 2^24-32 (32-bit); at
this point it starts returning "a system limit has been reached". On
32-bit systems, this check works all the way up through the bad
argument exception mentioned above. On 64-bit, this check stops
working where 2^34 < N < 2^35; it begins attempting to allocate memory
again, eventually crashing.
Running Fedora 10 (x86_64). Both R12B-4 (via
erlang-R12B-4.3.fc10.x86_64.rpm) and R12B-5 (latest source w/ OTP-7738
patch) affected:
Erlang (BEAM) emulator version 5.6.5 [source] [64-bit] [smp:2]
[async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.6.5 (abort with ^G)
1> 2#1 bsl (trunc(math:pow(2,34))-1).
** exception error: a system limit has been reached
in operator bsl/2
called as 1 bsl 17179869183
2> 2#1 bsl (trunc(math:pow(2,35))).
Crash dump was written to: erl_crash.dump
eheap_alloc: Cannot allocate 4454408120 bytes of memory (of type "heap").
Aborted
...
Eshell V5.6.5 (abort with ^G)
1> 2#1 bsl trunc(math:pow(2,59)).
** exception error: bad argument in an arithmetic expression
in operator bsl/2
called as 1 bsl 576460752303423488
2> 2#1 bsl (trunc(math:pow(2,59))-1).
Crash dump was written to: erl_crash.dump
eheap_alloc: Cannot allocate 72057594037928000 bytes of memory (of
type "heap_frag").
Aborted
Core dump available on request.
Cheers,
Daniel Hedlund
daniel@REDACTED
More information about the erlang-bugs
mailing list