SIGFPE能处理上下溢吗?
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. |
---|---|
用了-O3 的输出 |
Got jmp val 0. |
SIGFPE能处理上下溢吗?的更多相关文章
- 嵌入式单片机STM32应用技术(课本)
目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...
- 高级定时器TIM1&TIM8
高级定时器 初识stm32高级定时器: (1)高级控制定时器(TIM1 和 TIM8)和通用定时器在基本 ...
- 第32章 TIM—高级定时器—零死角玩转STM32-F429系列
第32章 TIM—高级定时器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- Linux signal 那些事儿(4)信号的deliver顺序【转】
转自:http://blog.chinaunix.net/uid-24774106-id-4084864.html 上一篇博文提到了,如果同时有多个不同的信号处于挂起状态,kernel如何选择deli ...
- visual studio检查运算上溢/下溢的开关位置
[注意] 勾选这个选项会对应用程序的整体性能造成一些影响,但是会更加安全.具体情况根据项目需求来决定.
- underflow 、overflow 下溢和上溢
在strtoull函数返回值中,就提到上溢和下溢的问题,现在把这俩个概念拿出来涨涨见识! 上溢 Overflow 是当一个超长的数据进入到缓冲区时,超出部分被写入上级缓冲区,上级缓冲区存放的可能是数 ...
- Linux suse x86_64 环境上部署Hadoop启动失败原因分析
一.问题症状: 在安装hadoop的时候报类似如下的错误: # A fatal error has beendetected by the Java Runtime Environment: # # ...
- <转>Linux环境进程间通信(二): 信号(上)
原文链接:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html 原文如下: 一.信号及信号来源 信号本质 信号是在软件层 ...
- 写一个Windows上的守护进程(7)捕获异常并生成dump
写一个Windows上的守护进程(7)捕获异常并生成dump 谁都不能保证自己的代码不出bug.一旦出了bug,最好是崩溃掉,这样很快就能被发现,若是不崩溃,只是业务处理错了,就麻烦了,可能很长时间之 ...
随机推荐
- Windows10、ARM开发板、VMware虚拟机同时连接Internet
前段时间有人遇到一些网络连接问题,让我帮忙处理,他想让ARM开发板连接外网,可以连接网络数据库,同时保证自己的电脑可以上网. 本来说直接可以连接一个路由器,分配一个内网IP给ARM就可以了,但是当时那 ...
- ios30---pthread, NSThread, GCD, NSOperation
pthread(线程库,很早就有的技术,了解):一套通用的多线程API适用于Unix\Linux\Windows等系统(java开发也有pthread)跨平台\可移植使用难度大(全是C函数) C语言 ...
- HDU 5783Divide the Sequence
Divide the Sequence Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- 【POI2007】【Bzoj 1103】大都市meg
http://www.lydsy.com/JudgeOnline/problem.php?id=1103 在线查询某点到根节点的点权和,参考DFS序&欧拉序列,用树状数组维护即可O(nlogn ...
- IOS程序运行过程
IOS程序是从main开始运行的,main.m文件内容如下: #import <UIKit/UIKit.h> #import "AppDelegate.h" int m ...
- JSP-Runoob:JSP简介
ylbtech-JSP-Runoob:JSP简介 1.返回顶部 1. JSP 简介 什么是Java Server Pages? JSP全称Java Server Pages,是一种动态网页开发技术.它 ...
- JSSDK使用步骤
绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. 备注:登录后可在“开发者中心”查看对应的接口权限. 引入js文件 在需要调用JS接口的页面引入如下JS文件,( ...
- 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 ...
- sql让时间调前,调后的语句
时间调前,调后 select billid,DATEADD(mm,2,billdate) from bi_Bill 注:用dateadd(/时间年/月/日,调前或后多少,字段) mm为月份,2为调前两 ...
- oracle创建数据库与配置监听器
上述是数据库创建完毕 *检测创建 -------------------------------------------------------------2配置监听器---------------- ...