On 2020-05-27 00:27 -0500, Bruce Dubbs write:
> On 5/26/20 11:43 PM, Xi Ruoyao wrote:
> > On 2020-05-26 18:17 +0100, Ken Moffat wrote:
> > > I'm trying to discover why two tests in the testsuite for 'check'
> > > always fail for me.  I've now got a response that the tests raise
> > > SIGFPE but do not receive it.  The example is
> > > 
> > > ken@plexi ~/check-debug $cat test.c
> > > #include <stdio.h>
> > > 
> > > #include <signal.h>
> > > 
> > > 
> > > int main() {
> > > 
> > >    printf("Before\n");
> > > 
> > >    raise(SIGFPE);
> > > 
> > >    printf("After\n");
> > > 
> > >    return 0;
> > > 
> > > }
> > > 
> > > followed by gcc test.c ; ./a.out
> > > 
> > > That should terminate on the signal, but for me it doesn't:
> > > 
> > > ken@plexi ~/check-debug $./a.out
> > > Before
> > > After
> > > 
> > > 
> > > However, if I try a division by zero I do get the exception:
> > > 
> > > ken@plexi ~/check-debug $cat divbyzero.c
> > > #include <stdio.h>
> > > 
> > > #include <signal.h>
> > > 
> > > 
> > > int main() {
> > > 
> > >   int a = 1000;
> > >   int z = 0;
> > >   int result;
> > > 
> > >    printf("Before\n");
> > > 
> > >    //raise(SIGFPE);
> > >    result = a / z;
> > > 
> > >    printf("After\n");
> > > 
> > >    return result;
> > > 
> > > }
> > > 
> > > gcc -o divbyzero divbyzero.c
> > > 
> > > ken@plexi ~/check-debug $./divbyzero
> > > Before
> > > Floating point exception
> > > 
> > > 
> > > Any clues to how I can find what is causing this breakage, please ?
> > > It seems to happen on all my machines.
> > 
> > If SIGFPE is somehow masked by sigprocmask, this phenomenon would
> > happen.  The
> > SIGFPE raised by raise() will be masked, but the SIGFPE produced by 1/0 is
> > still
> > undefined behavior (on x86_64 Linux normally "as if" a SIGFPE is received).
> > 
> > And, the signal mask set with sigprocmask is inherited during fork() and
> > preserved during exec().  So if your shell or init process masked SIGFPE for
> > some reason (intentionally or mistakenly) this will happen.
> > 
> > Try to examine the signal mask:
> > 
> > #include <stdio.h>
> > #include <signal.h>
> > 
> > int main()
> > {
> >     sigset_t ss;
> >     sigprocmask(SIG_BLOCK, NULL, &ss);
> >     if (sigismember(&ss, SIGFPE))
> >             puts("oops! SIGFPE is masked!");
> >     else
> >             puts("SIGFPE is not masked.");
> >     return 0;
> > }
> 
> Nice code Xi.  When I ran this I got 'SIGFPE is not masked'.  And when I 
> ran Ken's code, I got:
> 
> Before
> Floating point exception
> 
> Ken sometimes does unusual things, but I'll note on 'man 7 signal' there 
> is a section:
> 
> BUGS
> There  are  six signals that can be delivered as a consequence of a 
> hardware exception: SIGBUS, SIGEMT, SIGFPE, SIGILL, SIGSEGV, and 
> SIGTRAP.  Which of these signals is delivered,  for  any  given 
> hardware  exception, is not documented and does not always make
> sense.

That's when these signals are generated by CPU.  But Ken is raising SIGFPE with
raise() so it should be delivered.

> I note that FPE stands for Floating Point Exception, but Ken is doing an 
> integer divide.  It could be a HW architecture issue.

I think the name "floating point exception" is just historical.  On "modern"
x86/x86-64 Linux it's usually caused by integer division by 0.  Ironically
floating division by 0 (1.0 / 0.0) doesn't cause SIGFPE - the result is just
INF.
-- 
Xi Ruoyao <[email protected]>
School of Aerospace Science and Technology, Xidian University

-- 
http://lists.linuxfromscratch.org/listinfo/lfs-support
FAQ: http://www.linuxfromscratch.org/blfs/faq.html
Unsubscribe: See the above information page

Do not top post on this list.

A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing in e-mail?

http://en.wikipedia.org/wiki/Posting_style

Reply via email to