C 为什么要浮动;除零“;例外情况是';即使设置了处理程序,也不能在函数中捕获?

C 为什么要浮动;除零“;例外情况是';即使设置了处理程序,也不能在函数中捕获?,c,libc,C,Libc,当我发现有奇怪的行为时,我试着学习C语言中的信号处理 当x/=y时;在信号处理器工作的主函数的上下文中执行。但是,当在某个函数(bad_func)中执行相同的操作时,处理程序将被忽略,但SIGFPE的信号处理程序已设置 问:为什么我的全局信号处理程序在调用control87时没有捕捉到SIGFPE (MS VC 2010): #包括“stdafx.h” #包括 #包括 #包括 #包括 #包括 jmp_buf g_jb_MainFunc; 空钩zd(内部一) { printf(“结果:%i\n”,

当我发现有奇怪的行为时,我试着学习C语言中的信号处理
当x/=y时;在信号处理器工作的主函数的上下文中执行。但是,当在某个函数(bad_func)中执行相同的操作时,处理程序将被忽略,但SIGFPE的信号处理程序已设置

问:为什么我的全局信号处理程序在调用control87时没有捕捉到SIGFPE

(MS VC 2010):

#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
jmp_buf g_jb_MainFunc;
空钩zd(内部一)
{
printf(“结果:%i\n”,i);
longjmp(g_UJB_UMainfunc,5);
}
无效无效函数(无效)
{
双x=0,y=0。;
看跌期权(“hello1”);
//中止();
x/=y;
看跌期权(“bye1”);
}
int main(int argc,char*argv[])
{
双x=0,y=0。;
信号(SIGFPE、hook_zd);
信号机(SIGABRT、hook_zd);
放置(“你好”);
_对照组87(0,_MCW_EM);
国际关系;
如果(!(res=setjmp(g_jb_MainFunc)))
{
//中止();
//x/=y;
坏函数();
}否则
{
printf(“从以下位置跳到此处:%i\n”,res);
}
卖出(“再见”);
返回0;
}

除非我在编译时启用了优化,否则它对我有效。例如,如果我从命令行将其编译为
cl mysigtest.cpp
,则异常会按预期工作。但是如果我编译它
cl/O1 mysigtest.cpp
,那么它不会显示异常

反汇编代码显示了问题:

?bad_func@@YAXXZ (void __cdecl bad_func(void)):
  00000000: 68 00 00 00 00     push        offset ??_C@_06CKBHOFLC@hello1?$AA@
  00000005: E8 00 00 00 00     call        _puts
  0000000A: 68 00 00 00 00     push        offset ??_C@_04EEFJMNKA@bye1?$AA@
  0000000F: E8 00 00 00 00     call        _puts
  00000014: 83 C4 08           add         esp,8
  00000017: C3                 ret
这个部门已经优化了。在关闭优化的情况下尝试,或将
bad_func
更改为以下内容。对我来说,它“击败”了优化器:

double bad_func(double y)
{
    double x = 0.; 
    puts("hello1");
    //abort();
    x /= y;
    puts("bye1");
    return x;
}
并更改对它的调用:

bad_func( 0.0 );

\u control87
仅用于浮点运算,整数运算是完全不同的事情。这可能会有帮助:GMan:在Unix上设置浮点控制字也与整数除以零有关。所以“float”这个名字来自向后兼容。谢谢!我会在asm级别检查它,如果这是由于优化!美好的添加_fpreset()也很好;在hook_zd中的longjmp之前,如果我们想在SIGFPE之后继续执行。否则,下次使用FPU时,程序会在我的环境中崩溃。
bad_func( 0.0 );