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,最好是崩溃掉,这样很快就能被发现,若是不崩溃,只是业务处理错了,就麻烦了,可能很长时间之 ...
随机推荐
- 怎样在gluster的源代码中加入自己的xlator
本文并不说明怎样编写一个xlator.在glusterfs3.6.1下验证成功 目标在glusterfs-3.6.1/xlators/debug/下建立一个自己的xlator库并能够统一安装到系统文件 ...
- tf.float32 implicity
简介 | TensorFlow https://tensorflow.google.cn/programmers_guide/low_level_intro 我们来构建一个简单的计算图.最基本的指 ...
- Delphi中SendMessage使用说明(所有消息说明) good
Delphi中SendMessage使用说明 SendMessage基础知识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数Po ...
- 谈谈C++私有继承
很多C++程序猿从来没用过私有继承来设计他的类.的确,假设是本该用私有继承的地方却用了公有继承.对程序的功能的实现并无影响. 但这样的误用是一种错位的描写叙述.会引起阅读者的误解,甚至会引起类的使用者 ...
- leetcode 690. Employee Importance——本质上就是tree的DFS和BFS
You are given a data structure of employee information, which includes the employee's unique id, his ...
- POJ 2728 Desert King (最优比例生成树)
POJ2728 无向图中对每条边i 有两个权值wi 和vi 求一个生成树使得 (w1+w2+...wn-1)/(v1+v2+...+vn-1)最小. 采用二分答案mid的思想. 将边的权值改为 wi- ...
- vue的学习网址
Vue官网:http://cn.vuejs.org/v2/guide/index.html 淘宝镜像:http://npm.taobao.org/ Vue-router:https://router. ...
- 【Linux】小米路由开启SSH访问权限
一.验证小米路由ROM是否为开发版 1. 登录小米路由Web管理页面,检查ROM版本是否为开发版(若为开发版直接跳至第二步,若为稳定版继续本步骤). 2. 进入小米路由器官网(http://www1 ...
- C# 动态调用 WebService (转)
在 Visual Studio 中客户端程序可以添加服务引用来调用 WebService,这样 Visual Studio 会生成与之相关的代理类,通过这个代理类可以很方便的访问所需要的服务. 如果服 ...
- OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程
OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程 此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘! 1.创建根证私钥命令:openssl g ...