我觉得这是一个愚蠢的问题,但是我发现零关于这个主题的信息(不在这里也不在任何地方),所以这里是问题:
上下文(你可能已经知道):SIGFPE
异常和si_code
字段
在POSIX/Linux中,我们有一种特殊的信号叫做SIGFPE
(尽管它的名字,它既用于浮点数也用于整数算术错误)。当我们使用sigaction()
为SIGFPE
注册一个信号处理程序时,我们的处理程序还接收到一个名为si_code
的字段,该字段解释了为什么会引发特定的SIGFPE
异常。例如,一个可能的si_code
值是FPE_INTDIV
,您可以通过将int
除以0
来快速测试它。
问题:FPE_INTOVF
呢?
我的问题是关于一个特定的si_code
,即FPE_INTOVF
. 此代码描述为Value signalling integer overflow in case of SIGFPE signal
。
问题是,我从来没有遇到过这个信号被提出的例子,也没有找到一种方法让操作系统提出这种信号:当我在C中做一个整数溢出时,没有SIGFPE
异常被抛出。但是SIGFPE
的FPE_INTOVF
值是一种暗示,它可能会让主机在整数溢出的情况下抛出(就像它已经为整数除零所做的那样)。
问题:
FPE_INTOVF
不可用?它只是一种没有posix兼容的操作系统实现过的信号类型的占位符吗?或者是否有可能指示操作系统在整数溢出的情况下抛出这种信号?
我对使用sigaction()
从C程序捕获FPE_INTOVF
信号很感兴趣。
注:我认识到,从技术上讲,无符号整数溢出在C中并不是一个错误(它在C中根本不存在,因为所有的无符号整数算术都有"包装";行为),但签名整数溢出确实是未定义的行为,所以我希望FPE_INTOVF
处理后者。
br:
类型SIGFPE FPE_INTOVF
的异常只有在底层硬件支持时才会被抛出。例如,在Linux上,这些arch可能抛出FPE_INTOVF
:alpha
、ia64
、m68k
、mips
、parisc
、s390
和superh
。
没有回答我的问题,但值得注意:
我的问题是关于FPE_INTOVF
的,但是如果一个人只是想检查一般的整数溢出,值得注意的是,有其他方法可以这样做:特定于编译器的函数,如__builtin_sadd_overflow()
(在这里阅读更多)或特定于编译器的标志,如GCC上的-ftrapv
。
<<h3>信用/h3>我要感谢用户KamilCuk, Steve Summit和Nate Eldredge通过他们的评论为这个答案做出了贡献。
注::如果有人想要添加关于FPE_INTOVF
的其他信息,他们可以发布另一个答案来回答这个问题,或者他们可以写一个评论来回答这个问题,我会编辑答案来添加额外的信息。