[erlang-bugs] Erlang problems with big binaries

Mikael Pettersson mikpelinux@REDACTED
Wed Jan 21 19:13:26 CET 2015


Nico Kruber writes:
 > I'd like to 'bor' (binary or) a big binary but the result is an empty list(?!)
 > Smaller binaries work as expected.
 > 
 > Steps to reproduce (at least on Erlang 17.4):
 > 
 > A=erlang:term_to_binary(lists:seq(1000000,2200000)).
 > B=erlang:term_to_binary(lists:seq(1000001,2200001)).
 > ASize=erlang:bit_size(A).
 > BSize=erlang:bit_size(B).
 > <<ANr:ASize>> = A.
 > <<BNr:BSize>> = B.
 > XNr = ANr bor BNr.
 > <<XNr:BSize>>.
 > 
 > 
 > Please note that printing the actual values of A or B is not a good idea ;)
 > and so would XNr but including it directly into a binary fails with the same 
 > error: "** exception error: bad argument"
 > <<(ANr bor BNr):BSize>>.

The problem is that erts/emulator/beam/big.c:big_norm() contains:

    if ((arity = BIG_NEED_SIZE(xl)-1) > BIG_ARITY_MAX)
      return NIL;  /* signal error (too big) */

where BIG_ARITY_MAX is 0x7ffff, but:

1) this is an implementation restriction which can, as this
case proves, be exceeded by simple application code, and

2) erts_{band,bor,bxor}() check for this with ASSERT(is_not_nil(...)),
but that's wrong since this is about input validation and implementation
limits not fundamental logic, and it's ineffective for release builds.

These three functions need to turn this case into a system limit
exception, just like a lot of other places in erl_arith.c already do.
(Well, at least _bor() and _bxor() do, perhaps _band() doesn't need to.)

/Mikael



More information about the erlang-bugs mailing list