好吧,我搜索了有关 SIGFPE 的文章,然后我写了一些测试,但它的行为很奇怪。那我只好在这里发帖寻求帮助了。 GCC/G++ 或 ISO C++ 是否明确定义了除以零会发生什么?
1)我搜索了这篇文章:除以零不会抛出 SIGFPE https://stackoverflow.com/questions/7267838/division-by-zero-does-not-throw-sigfpe它的输出相同是 inf
2)如果我将其重写如下:
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;
}
那么signal_handler就不会发生。但如果我取消注释该行
//fprintf(stderr,"d number is %d\n,d);
然后signal_handler继续调用。
有人可以解释一下吗?
这很有趣:随着fprintf
注释掉后,编译器确定计算结果为:d = b/c
是未使用的本地表达式,可以优化掉。
但显然,它在执行过程中并非没有副作用,但编译器在此阶段无法确定有关运行时环境的任何信息。令我惊讶的是,静态分析在现代编译器中(至少)没有将其视为警告。
@vonbrand是对的。您很幸运在(异步)信号处理程序中所做的事情。
Edit:当你说“signal_handler不断调用”时,你的意思是它无限期地重复吗?如果是这样,则底层系统调用重新启动可能会出现问题。尝试:siginterrupt(SIGFPE, 1);
(假设它可用)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)