well, I have searched the articles about SIGFPE ,then I wrote a few tests but it's behavoir is strange. Then I have to post it here to ask for help. Is the GCC/G++ or ISO C++ clearly defined what happens if divide by zero?
1) I searched the article : Division by zero does not throw SIGFPE it sames the output is inf
2) If I rewrite it as the following:
void signal_handler (int signo) {
if(signo == SIGFPE) {
std::cout << "Caught FPE\n";
}
}
int main (void) {
signal(SIGFPE,(*signal_handler));
int b = 1;
int c = 0;
int d = b/c;
//fprintf(stderr,"d number is %d\n,d);
return 0;
}
then signal_handler will not happens. but if I uncomment the line
//fprintf(stderr,"d number is %d\n,d);
then signal_handler keeps calling.
can someone explains it ?
This is interesting: With the fprintf
commented out, the compiler has determined that the calculated result: d = b/c
is an unused local expression and can be optimized away.
Clearly though, it is not side-effect free in its execution, but the compiler can't determine anything about the runtime environment at this stage. I'm surprised that static analysis doesn't pick this up as a warning (at least) in a modern compiler.
@vonbrand is right. You got lucky with what you're doing in the (asynchronous) signal handler.
Edit: when you say "signal_handler keeps calling", do you mean it's repeating indefinitely? If so, there could be issues with underlying system calls restarting. Try: siginterrupt(SIGFPE, 1);
(assuming it's available).