[erlang-bugs] enif_make_int64 => -0 for INT64_MIN with gcc 4.9.1
Tuncer Ayaz
tuncer.ayaz@REDACTED
Sun Jul 20 22:00:13 CEST 2014
On Sun, Jul 20, 2014 at 3:27 AM, Tomas Abrahamsson wrote:
> Hi,
>
> I upgraded gcc from version 4.8.1 to 4.9.1, recompiled Erlang/OTP-17.1.1
> and my nif, and now enif_make_int64 creates -0 for INT64_MIN.
>
> % make test
> erl -s int64nif go -s erlang halt
> Erlang/OTP 17 [erts-6.1.1] [source] [smp:4:4] [async-threads:10]
> [kernel-poll:false]
>
> -0
>
> When Erlang was compiled with gcc-4.8.1, it printed -9223372036854775808,
> I've attached the test programs, here are the important lines:
>
> go() ->
> io:format("~p~n", [int64_from_nif()]).
>
> The NIF C-code contains:
>
> static ERL_NIF_TERM
> int64_from_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
> {
> return enif_make_int64(env, INT64_MIN);
> }
>
> System information:
>
> OS: linux, 32-bit core i5, 3.14-1-686-pae (debian unstable)
> Erlang/OTP: built from scratch (both times) from the OTP-17.1.1 git tag.
> gcc: initially: gcc (Debian 4.8.1-10) 4.8.1
> with this one, it prints -9223372036854775808
> gcc: after upgrade: gcc (Debian 4.9.1-1) 4.9.1
> with this one, it prints -0
>
> The only change I did was apt-get install gcc and then rebuilding Erlang.
I can confirm this on linux amd64.
17.1.2 gcc 4.8.2 -> -9223372036854775808
17.1.2 gcc 4.9.0 -> -0
17.1.2 gcc 4.9.1 -> -0
16B03-1 gcc 4.8.2 -> -9223372036854775808
16B03-1 gcc 4.9.0 -> 0
16B03-1 gcc 4.9.1 -> 0
I suppose you're not able to distill this to stand-alone C code, right?
I don't think it will reveal anything, but it's an easy way to find
bugs, so maybe you can try building with -fsanitize=undefined. If you
want to do that, I'd suggest to apply the patch available at
https://github.com/erlang/otp/pull/429 and run
"configure --enable-sanitizers=undefined".
More information about the erlang-bugs
mailing list