wad*_*wad 6 c floating-point exception-handling
我试图在C中捕获浮点溢出.这是我尝试过的
#define _GNU_SOURCE
#include <fenv.h>
#include <signal.h>
#include <stdio.h>
void catch_overflow (int sig) {
printf ("caught division by zero\n");
signal (sig, catch_overflow);
}
int main(void) {
feenableexcept(FE_DIVBYZERO);
signal (FE_DIVBYZERO, catch_overflow);
float a = 1., b = 0.; float c = a/b; return 0; }
Run Code Online (Sandbox Code Playgroud)
我希望看到"被零删除"消息,但我只得到一个核心转储消息,"浮点异常(核心转储)".我怎么能修改程序以获得"被零除"的消息?
谢谢.
浮点异常以机器和操作系统相关的方式转换为某种信号方法。但这种方式不允许混合不同的常量空间,如 FE_xxx 和 SIGxxx。使用FE_DIVBYZERO
for signal() ,您确实捕获了SIGILL
哪些不是为浮点错误生成的(因为您没有指定操作系统,我可以自由选择任何操作系统 - 在我的情况下为 Linux)。
对于您的程序,我在 Linux 下捕获了这个异常,并进行了两处更改:
设置要处理的信号编号SIGFPE
。
声明a, b, c
为易失性(防止编译器在编译时计算c
)INF
。
此后,程序陷入永久循环打印“被零除”,因为此类错误的信号处理程序将执行恢复到同一命令。您应仔细考虑如何纠正此类错误,而不会使错误指令永久化。例如,您可以使用longjmp
退出信号处理程序到已安装的异常处理程序。
而且,您仍然应该查阅目标操作系统手册以了解如何捕获 FP 错误。
(这已经在主要部分的评论中进行了描述 - 但我考虑形成一个明确的答案。)