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. gitlab结构分析

    1 gitlab的工作流程 2

  2. 使用 FFmpeg 处理高质量 GIF 图片

    使用 FFmpeg 处理高质量 GIF 图片 - 为程序员服务  http://ju.outofmemory.cn/entry/169845

  3. C++中UINT32和INT32以及int,BOOL和bool的差别

    在AndroidHAL层开发中,编写C++代码的时候.遇到了数据类型的困扰.经过查找资料,总结例如以下: 1.UNIT32和int以及INT32的差别: (1).int默认是signed int.也就 ...

  4. sparksql语句

    (1)in 不支持子查询 eg. select * from src where key in(select key from test);支持查询个数 eg. select * from src w ...

  5. 【POJ 1364】 King

    [题目链接] 点击打开链接 [算法] 差分约束系统 [代码] #include <algorithm> #include <bitset> #include <cctyp ...

  6. 百度上传组件 WebUploader

    WebUploader http://fex.baidu.com/webuploader/doc/index.html WebUploader API 文档详细解读 源码以及示例:https://gi ...

  7. Linux常用命令分类

    目录:相对路径和绝对路径. 绝对路径:路径的写法[一定由根目录 / 写起],例如: /usr/share/doc 这个目录. 相对路径:路径的写法[不是由 / 写起],例如由 /usr/share/d ...

  8. .net引用System.Data.SQLite操作SQLite

    之所以要做这个笔记,是因为在.NET中使用System.Data.SQLite的时候,遇到了些问题,这些问题是相对于引用其他dll没有遇到过的,所以作个笔记,记录一下. 简单起见,首先建立一个控制台项 ...

  9. 406 Queue Reconstruction by Height 根据身高重建队列

    假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列.注意:总人数少于1100人.示 ...

  10. WCF wsdlexception(at/html):faultCode=INVALID_WSDL

    WCF 部署正常,通过浏览器查看服务也OK,但是通过SOAP UI创建客户端请求时就异常: wsdlexception(at/html):faultCode=INVALID_WSDL: Expecte ...