[erlang-patches] Per-thread FPE pointer not being initialized
Raimo Niskanen
raimo+erlang-patches@REDACTED
Wed Jul 1 17:16:24 CEST 2009
On Wed, Jul 01, 2009 at 01:55:39PM +0200, Mikael Pettersson wrote:
> Raimo Niskanen writes:
> > On Wed, Jul 01, 2009 at 12:03:04PM +0200, Mikael Pettersson wrote:
> > > David Reiss writes:
> > > > The per-thread last floating point exception pointer is not initialized to
> > > > NULL when it is allocated. As a result, spurious floating point
> > > > exceptions are reported.
> > > >
> > > > This is 100% reproducible for me on CentOS 5.1 for x86-64, with Erlang/OTP
> > > > R13B built from source with gcc 2.5 and gcc 4.1.2. It doesn't happen with
> > > > R13B01, but, based on the nature of the bug, I think that is most likely
> > > > due to chance.
> > > >
> > > > Steps to reproduce:
> > > >
> > > > 1/ Start up a node with
> > > > dreiss@REDACTED:~$ erl -noshell -name bob@`hostname`
> > > >
> > > > 2/ Build and compile test program
> > > > dreiss@REDACTED:~$ cat test.erl
> > > > -module(test).
> > > > -export([start/1]).
> > > > start([Remote]) ->
> > > > rpc:call(Remote, erlang, is_float, [750.0]).
> > > > dreiss@REDACTED:~$ erlc test.erl
> > > >
> > > > 3/ Run test program
> > > > dreiss@REDACTED:~$ erl -noshell -name alice@`hostname` -pz . -s test
> > > > start bob@`hostname` -s init stop
> > > >
> > > > The "alice" node exits with no output. After running the "alice" command,
> > > > the "bob" node prints the following
> > > >
> > > > ERTS_FP_CHECK_INIT at 0x4aaded: detected unhandled FPE at 0x2
> > > >
> > > > Patch:
> > > >
> > > > diff otp_src_R13B/erts/emulator/sys/unix/sys_float.c
> > > > otp_src_R13B/sys/unix/sys_float.c/sys/unix/sys_float.c
> > > > --- otp_src_R13B/erts/emulator/sys/unix/sys_float.c 2009-06-30
> > > > 17:53:31.000000000 -0700
> > > > +++ otp_src_R13B/erts/emulator/sys/unix/sys_float.c 2009-06-30
> > > > 17:53:31.000000000 -0700
> > > > @@ -57,7 +57,8 @@
> > > > void erts_thread_init_fp_exception(void)
> > > > {
> > > > unsigned long *fpe = erts_alloc(ERTS_ALC_T_FP_EXCEPTION, sizeof(*fpe));
> > > > + *fpe = 0;
> > > > erts_tsd_set(fpe_key, fpe);
> > > > }
> > >
> > > Thanks, that bug was mine :-( Your fix is correct.
> >
> > Would your patch in http://www.erlang.org/cgi-bin/ezmlm-cgi/2/1380
> > also solve this problem? Or are both needed?
> >
> > --- otp-0622/erts/emulator/sys/unix/sys_float.c.~1~ 2009-02-26 11:45:48.000000000 +0100
> > +++ otp-0622/erts/emulator/sys/unix/sys_float.c 2009-06-26 11:14:15.000000000 +0200
> > @@ -792,6 +792,8 @@ sys_chars_to_double(char* buf, double* f
> > int
> > matherr(struct exception *exc)
> > {
> > +#if !defined(NO_FPE_SIGNALS)
> > set_current_fp_exception((unsigned long)__builtin_return_address(0));
> > +#endif
> > return 1;
> > }
>
> The two patches fix independent issues. The #if !defined change in
> sys_chars_to_double() fixes a compile/link error with !gcc.
Sorry I misread the patch. I accidentally saw it add
set_current_fp_exception(0) to matherr(exc) but it
only added preprocessor directives...
>
> /Mikael
>
> ________________________________________________________________
> erlang-patches mailing list. See http://www.erlang.org/faq.html
> erlang-patches (at) erlang.org
--
/ Raimo Niskanen, Erlang/OTP, Ericsson AB
More information about the erlang-patches
mailing list