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.
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.
		
时间: 2024-08-04 17:59:51

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

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

转自:http://blog.chinaunix.net/uid-24774106-id-4084864.html 上一篇博文提到了,如果同时有多个不同的信号处于挂起状态,kernel如何选择deliver那个信号.          next_signal 负责从挂起信号中选择deliver的signo:当然,有线程显存私有的penging,有线程组共有的pending,对于线程而言,先从自己私有的pending中选,处理完毕私有的才会去处理线程组共有的pending,这个逻辑的代码在: in

量化、数据类型、上溢和下溢

之前在写某个迭代算法的时候,发现算法在某些情况下会出错,后来调试过程中发现,计算过程中,某些理论上大于0的数值会在迭代过程中变为0,最后计算过程中出现了除0,导致结果出错.这篇文章的初始目的就是为了阐明为何某些理论上大于0的数在实际计算中会变为0(下溢),后来顺便将很多人讨论过数据类型转换.运算精度也写进去了.之前的有些博客可能有一些局限性(局限于小数或是其他),这的确是一个不好阐述的话题,因此我从数字信号处理中的量化出发,试图给出一个较为直观的认识.文章可能还有一些问题,还请批评指正. 1.

C语言中整数上溢,浮点数上溢,浮点数下溢问题

1.整数上溢的问题:在我的系统中int最大值为2147483647 ,如果出现整数上溢,运行结果为: 如果是无符号整数,出现整数上溢,运行结果为: 2.如果是浮点型,例如系统的最大值是3.4e38 ,如果*100,就会发生浮点数的上溢.本机运行结果为: 如果出现下溢,本机运行结果为: 出现NaN

视频编解码,bbv 缓冲区的上溢和下溢

使用硬件相似的数据处理.一般都是数据进来,处理后立即发出去的形式.所以一般有一个数据进,一个数据出,2个接口. 硬件处理基本都要求实时.数据进来,处理之后马上发处理,这个时间要求非常短,一般要求控制在好多毫秒以内,才能达到实时的要求.一般硬件每秒钟能够处理的数据大小,在设计的时候就固定了.不能像软件那样,可以通过增加CPU来提升处理能力.而且硬件的缓存的容量也是在设计的时候就固定了,不能像软件那样,随意申请内存来用. 所以硬件的缓存都不会太大.缓存的数据太大,会造成等待数据处理延时太高.达不到实

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

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

手游频繁崩溃”闪退”? 从程序上找原因

游戏程序 平台类型: iOS Android  程序设计: 算法逻辑/智能AI 服务器 数据库  编程语言: C/C++ Java  引擎/SDK: 其它  <ignore_js_op> 文 / 网易 Tjay(QA) 作为玩家,当游戏crash的时候是什么心情,如果这个游戏玩起来还不错的话,那我可能还会打开第二次,如果这个游戏一般的话我可能直接怒删了.当多次出现闪退crash的时候,这种糟糕的体验很容易让用户流失,造成很大的损失.但是作为测试人员,面对如此棘手的事情,首先要做的是协助开发组解

《JavaScript权威指南》拾遗(上)

一.语言基础 1.javascript中,只有null和undefined是无法拥有方法的值,它们都没有包装对象.typeof null == ‘object' , typeof undefined =='undefined' 2.在javascript运算中,上溢返回infinity,下溢返回0,也就是说被0整除并不报错,而是返回无穷大.而0/0返回NaN. 3.NaN的特殊性,它和任何值都不相等,也就是说,没法通过x==NaN来判断x是否是NaN,只能通过x!=x来判断,函数isNaN()的

细说linux IPC(七):信号(上)

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] 信号类似于中断请求,一个进程不会阻塞在某处等待信号的到来,也不会知道信号何时能到来,信号的产生是随机的,进程只需要注册信号处理函数,在信号到来时执行信号处理函数即可. linux系统支持的信号可以通过命令kill -l来查看: # kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTR

underflow 、overflow 下溢和上溢

在strtoull函数返回值中,就提到上溢和下溢的问题,现在把这俩个概念拿出来涨涨见识! 上溢  Overflow 是当一个超长的数据进入到缓冲区时,超出部分被写入上级缓冲区,上级缓冲区存放的可能是数据.上一条指令的指针,或者是其他程序的输出内容,这些内容都被覆盖或者破坏掉.可见一小部分数据或者一套指令的溢出就可能导致一个程序或者操作系统崩溃. 下溢 underflow 与之对应的就是下溢,下溢是当一个超长的数据进入到缓冲区时,超出部分被写入下级缓冲区,下级缓冲区存放的是下一条指令的指针,或者是