gpt4 book ai didi

c++ - C/C++ 处理程序 SIGFPE 是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:32 26 4
gpt4 key购买 nike

好吧,我搜索了有关 SIGFPE 的文章,然后我写了一些测试,但它的行为很奇怪。那我只好贴在这里求助了。 GCC/G++ 或 ISO C++ 是否明确定义了除以零时会发生什么?

1) 我搜索了这篇文章: 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 是对的。您在(异步)信号处理程序中所做的事情很幸运。


编辑:当您说“signal_handler keeps calling”时,您是说它会无限期地重复吗?如果是这样,底层系统调用重启可能会出现问题。尝试:siginterrupt(SIGFPE, 1);(假设可用)。

关于c++ - C/C++ 处理程序 SIGFPE 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14905947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com