Hi Brett,
I've a SIGFPE contribution in the pipeline by Federico Carminati. I'll
check it against your changes and add it. I'll add a rootrc flag for
turning this on and off. Default being off.
I'll fix the TGDoubleDSlider problem (interesting to find a SIGFPE in
GUI code ;-)
Cheers, Fons.
On Thu, 2003-05-22 at 17:48, Brett Viren wrote:
> Hi Rene, Fons, Rooters,
>
> As you may know, SIGFPE (floating point exception signals) are not
> emitted by default on GCC/GLIBC GNU/Linux platforms. They must be
> turned on (see below) to catch things like overflows, divide by zero,
> invalid FP number, etc.
>
> We recently turned this on in our own code and it is catching many
> problems, some merely anoying, but some real. It also is catching
> some (so far) trivial problems in ROOT proper (eg, creating a
> TGDoubleSlider with fVmin == fVmax causes SIGFPE in
> TGDoubleVSlider::DoRedraw).
>
> To help find these problems and make ROOT better I would like to
> suggest that the code below get added to ROOT and turned on by the
> developers when testing.
>
> I think that it should be turned off by default in production code as
> it is almost guaranteed that folks have lurking SIGFPEs in their code
> and they probably won't appreciate the rude awakening (although they
> should!). However, it would be nice to have its use triggered w/out
> having to re-compile, eg via setting an environment variable.
>
> The code is designed for GNU/Linux systems and I don't know how
> portable it is, but since this platform is one of, if not the,
> dominant platform it should be useful for many.
>
> Thanks,
> -Brett.
>
> ---------------------------------------------
>
> // sigfpe.h - turn on SIGFPE emission.
> // To use create a static instance:
> //
> // static sigfpe allow_sigfpe(true);
> //
> #ifndef SIGFPE_H
> #define SIGFPE_H
> #if defined(linux) // Implicit g++ definition
> #include <fpu_control.h>
> #include <fenv.h>
> #endif
> struct sigfpe
> {
> sigfpe(bool activate);
> ~sigfpe();
> #if defined(linux)
> #if defined(__GLIBC__)&&(__GLIBC__>2 || __GLIBC__==2 && __GLIBC_MINOR__>=1)
> fenv_t old_setting;
> #else
> fpu_control_t old_setting;
> #endif
> #endif
> bool activate_;
>
> static bool validate();
> };
> #endif // SIGFPE_H
>
> ---------------------------------------------
>
> // sigfpe.cxx
> #include "sigfpe.h"
>
> sigfpe::sigfpe(bool a) : activate_(a)
> {
> if(activate_==true) {
> #if defined(linux)
> #if defined(__GLIBC__)&&(__GLIBC__>2 || __GLIBC__==2 && __GLIBC_MINOR__>=1)
> fenv_t newval;
> fegetenv(&old_setting);
> fegetenv(&newval);
> newval.__control_word &= ~(FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW);
> fesetenv(&newval);
> #else
> old_setting = __fpu_control;
> fpu_control_t newval =
> old_setting & ~(
> _FPU_MASK_IM
> |_FPU_MASK_ZM
> |_FPU_MASK_OM
> );
> _FPU_SETCW(newval);
> #endif
> #endif
> }
> }
> sigfpe::~sigfpe()
> {
> #if defined(linux)
> if(activate_==true)
> #if defined(__GLIBC__)&&(__GLIBC__>2 || __GLIBC__==2 && __GLIBC_MINOR__>=1)
> fesetenv(&old_setting);
> #else
> _FPU_SETCW(old_setting);
> #endif
> #endif
> }
> // end sigfpe.cxx
>
> ---------------------------------------------
--
Org: CERN, European Laboratory for Particle Physics.
Mail: 1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch Phone: +41 22 7679248
WWW: http://root.cern.ch/~rdm/ Fax: +41 22 7679480
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:11 MET