SIGFPE可以报告算术异常。包括上下溢、除零等。

C标准库说:

各种实现报告的异常类型区别也很大,但几乎没有实现会报告整型溢出。

真的吗?我测试了一下,发现在GCC上,整型、浮点上下溢都不会报告,但是除0会报告。在使用-O3编译选项后,连除0都不报告了,直接继续执行。

看来处理上下溢真不能靠信号——为什么编译器不提供呢?这样不是非常方便吗?

附上测试的代码,大家可以在自己的机子上试一下,看看能不能处理上下溢。

#include <signal.h>
#include <setjmp.h>
#include <stdio.h>
#include <assert.h>
#include <limits.h>
#include <time.h> jmp_buf env;
enum TEST_STATE { OVERFLOW, INFLOW, ZERO, END }
state_group_[] = { OVERFLOW, INFLOW, ZERO, END },
*state = state_group_; void handle_SIGFPE(int signo); int main(int argc, char const *argv[])
{
int val;
int i; /* 改成double,如果想测试浮点上下溢。 */
time_t time_stamp;
signal(SIGFPE, handle_SIGFPE); val = setjmp(env);
printf("Got jmp val %d.\n", val); switch (*state) {
case OVERFLOW:
printf("Do overflow.\n");
++state;
i = INT_MAX;
time_stamp = time(NULL);
while (1) {
i++;
if (difftime(time(NULL), time_stamp) >= 5) {
printf("\tFailure. Timeout.\n");
longjmp(env, 2);
}
}
assert(0); case INFLOW:
printf("Do inflow.\n");
++state;
i = INT_MIN;
time_stamp = time(NULL);
while (1) {
i--;
if (difftime(time(NULL), time_stamp) >= 5) {
printf("\tFailure. Timeout.\n");
longjmp(env, 2);
}
}
assert(0); case ZERO:
printf("Do zero.\n");
++state;
i = 1/0;
assert(0); case END:
printf("Do exit.\n");
exit(0); default:
assert(0);
} assert(0);
return 0;
} void handle_SIGFPE(int signo)
{
printf("\tSuccess. Got signal SIGFPE %d.\n", signo);
longjmp(env, 1);
}
没用-O3的输出
Got jmp val 0.
Do overflow.
Failure. Timeout.
Got jmp val 2.
Do inflow.
Failure. Timeout.
Got jmp val 2.
Do zero.
Success. Got signal SIGFPE 8.
Got jmp val 1.
Do exit.
用了-O3的输出
Got jmp val 0.
Do overflow.
Failure. Timeout.
Got jmp val 2.
Do inflow.
Failure. Timeout.
Got jmp val 2.
Do zero.
Assertion failed!

Program: C:\Users\01\Desktop\report\a.exe
File: sigfpe.c, Line 58

Expression: 0

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

SIGFPE能处理上下溢吗?的更多相关文章

  1. 嵌入式单片机STM32应用技术(课本)

    目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...

  2. 高级定时器TIM1&TIM8

                                               高级定时器 初识stm32高级定时器:      (1)高级控制定时器(TIM1 和 TIM8)和通用定时器在基本 ...

  3. 第32章 TIM—高级定时器—零死角玩转STM32-F429系列

    第32章     TIM—高级定时器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  4. Linux signal 那些事儿(4)信号的deliver顺序【转】

    转自:http://blog.chinaunix.net/uid-24774106-id-4084864.html 上一篇博文提到了,如果同时有多个不同的信号处于挂起状态,kernel如何选择deli ...

  5. visual studio检查运算上溢/下溢的开关位置

    [注意] 勾选这个选项会对应用程序的整体性能造成一些影响,但是会更加安全.具体情况根据项目需求来决定.

  6. underflow 、overflow 下溢和上溢

    在strtoull函数返回值中,就提到上溢和下溢的问题,现在把这俩个概念拿出来涨涨见识! 上溢  Overflow 是当一个超长的数据进入到缓冲区时,超出部分被写入上级缓冲区,上级缓冲区存放的可能是数 ...

  7. Linux suse x86_64 环境上部署Hadoop启动失败原因分析

    一.问题症状: 在安装hadoop的时候报类似如下的错误: # A fatal error has beendetected by the Java Runtime Environment: # #  ...

  8. <转>Linux环境进程间通信(二): 信号(上)

    原文链接:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html 原文如下: 一.信号及信号来源 信号本质 信号是在软件层 ...

  9. 写一个Windows上的守护进程(7)捕获异常并生成dump

    写一个Windows上的守护进程(7)捕获异常并生成dump 谁都不能保证自己的代码不出bug.一旦出了bug,最好是崩溃掉,这样很快就能被发现,若是不崩溃,只是业务处理错了,就麻烦了,可能很长时间之 ...

随机推荐

  1. Windows10、ARM开发板、VMware虚拟机同时连接Internet

    前段时间有人遇到一些网络连接问题,让我帮忙处理,他想让ARM开发板连接外网,可以连接网络数据库,同时保证自己的电脑可以上网. 本来说直接可以连接一个路由器,分配一个内网IP给ARM就可以了,但是当时那 ...

  2. ios30---pthread, NSThread, GCD, NSOperation

    pthread(线程库,很早就有的技术,了解):一套通用的多线程API适用于Unix\Linux\Windows等系统(java开发也有pthread)跨平台\可移植使用难度大(全是C函数) C语言 ...

  3. HDU 5783Divide the Sequence

    Divide the Sequence Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  4. 【POI2007】【Bzoj 1103】大都市meg

    http://www.lydsy.com/JudgeOnline/problem.php?id=1103 在线查询某点到根节点的点权和,参考DFS序&欧拉序列,用树状数组维护即可O(nlogn ...

  5. IOS程序运行过程

    IOS程序是从main开始运行的,main.m文件内容如下: #import <UIKit/UIKit.h> #import "AppDelegate.h" int m ...

  6. JSP-Runoob:JSP简介

    ylbtech-JSP-Runoob:JSP简介 1.返回顶部 1. JSP 简介 什么是Java Server Pages? JSP全称Java Server Pages,是一种动态网页开发技术.它 ...

  7. JSSDK使用步骤

    绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. 备注:登录后可在“开发者中心”查看对应的接口权限. 引入js文件 在需要调用JS接口的页面引入如下JS文件,( ...

  8. bzoj2419

    http://www.lydsy.com/JudgeOnline/problem.php?id=2419 ∑Ui−UjRi,j=0∑Ui−UjRi,j=0 ∑U1−UjR1,j=1∑U1−UjR1,j ...

  9. sql让时间调前,调后的语句

    时间调前,调后 select billid,DATEADD(mm,2,billdate) from bi_Bill 注:用dateadd(/时间年/月/日,调前或后多少,字段) mm为月份,2为调前两 ...

  10. oracle创建数据库与配置监听器

    上述是数据库创建完毕 *检测创建 -------------------------------------------------------------2配置监听器---------------- ...