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. linux文件系统的权限简单介绍

    linux系统下,文件的权限是这样表示的: - --- --- --- 一共用10位的二进制进行表示,其中 位置 0 :  - :文件        d :目录剩下的9个位置:位置1-3 当前用户(应 ...

  2. C#.NEt-GDI+中的Pen測试

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. 阿里电话面试问题----100万个URL怎样找到出现频率最高的前100个?

    内推阿里电话面试中面试官给我出的一个题: 我想的头一个解决方式.就是放到stl 的map里面对出现的频率作为pair的第二个字段进行排序.之后依照排序结果返回: 以下口说无凭,show your co ...

  4. android studio 使用

    java5-7适用android,java8对安卓支持不好. mac osx 需要安装jdk8, google Nexus模拟器, Intellij是JetBrains发布的. Intellij有2个 ...

  5. ios33--线程通信

    // // ViewController.m // 06-掌握-线程间通信 // // atomic:为set方法加锁,线程安全,需要消耗资源. // nonatomic:不为set方法加锁,非线程安 ...

  6. 假如Java对象是个人······

    假如Java对象是个人,那意味着它也具备了我们人所有的东西,头,身体,大长腿. 头 头就是我们的对象头(Header).根据JAVA虚拟机规范,我们的对象头分为两部分,分别是存储对象自身的运行时数据和 ...

  7. bzoj4810

    http://www.lydsy.com/JudgeOnline/problem.php?id=4810 问题就在于怎么快速查询 我们先用莫队转移,但是没办法快速地查询,那么我们就用bitset这个东 ...

  8. 理解javascript中的事件模型

    javascript中有两种事件模型:DOM0,DOM2.而对于这两种的时间模型,我一直不是非常的清楚,现在通过网上查阅资料终于明白了一些. 一.  DOM0级事件模型 DOM0级事件模型是早期的事件 ...

  9. centos7的systemd

    系统启动流程 POST --> Boot Sequence --> Bootloader --> kernel+initramfs(initrd) --> rootfs --& ...

  10. asp.net 4.0 尚未在服务商注册 您需要手动将web服务器配置为 ASP.NET4.0,这样您的网站才能正常进行。

    VS2010打开项目出现的此问题 电脑先安装VS2010 然后安装VS2010 SP1补丁.然后安装VS2015 后来又安装了Framework4.6.1 用网上搜索到的平常方法无法解决此问题. 最后 ...