[erlang-patches] Per-thread FPE pointer not being initialized

Mikael Pettersson mikpe@REDACTED
Wed Jul 1 13:55:39 CEST 2009


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.

/Mikael


More information about the erlang-patches mailing list