4

我觉得这是一个愚蠢的问题,但我发现关于该主题的信息为零(不是这里也不是任何地方),所以这是问题:

上下文(您可能已经知道):SIGFPE异常和si_code字段

在 POSIX/Linux 中,我们有一种特殊的信号称为SIGFPE(尽管它的名字,它同时用于浮点和整数算术错误)。SIGFPE当我们为using注册一个信号处理程序时sigaction(),我们的处理程序还会收到一个名为的字段,该字段si_code解释了SIGFPE引发特定异常的原因。例如,其中一个可能的si_code值是 ,FPE_INTDIV您可以通过除以 来快速测试int0

问题:那怎么FPE_INTOVF办?

我的问题是关于一个特定的si_code,那就是FPE_INTOVF。此代码描述为Value signalling integer overflow in case of SIGFPE signal.

问题是我从未遇到过引发此信号的示例,也没有找到使操作系统引发此类信号的方法:当我在 C 中进行整数溢出时,不会SIGFPE引发异常。但是FPE_INTOVFfor 的值SIGFPE是一种暗示,它可能会在整数溢出的情况下使主机抛出(就像它已经对整数除以零所做的那样)。

问题:

FPE_INTOVF无法使用吗?它是否只是一种信号类型的占位符,没有符合 POSIX 的操作系统曾经实现过?或者是否可以指示操作系统在整数溢出的情况下抛出这种信号?

我真的对FPE_INTOVF使用sigaction().


PS:我认识到无符号整数溢出在技术上不是 C 中的错误(它在 C 中根本不存在,因为所有无符号整数算术都有“包装”行为),但有符号整数溢出确实是未定义的行为,所以我希望处理FPE_INTOVF后者。

4

1 回答 1

3

TL;博士:

SIGFPE FPE_INTOVF只有当底层硬件支持它们时,才会抛出类型异常。例如,在 Linux 上,这些是可能抛出的拱门FPE_INTOVFalpha, ia64, m68k, mips, parisc, s390, 和superh.

不是我的问题的答案,但值得注意的是:

我的问题FPE_INTOVF特别是关于,但如果一个人只是想检查一般的整数溢出,值得注意的是还有其他方法可以做到这一点:编译器特定的函数,如__builtin_sadd_overflow()在这里阅读更多)或编译器特定的标志,如-ftrapvGCC . 另请参阅有关 SO 的thisthis相关问题。

学分

我要感谢用户KamilCukSteve SummitNate Eldredge通过他们的评论对这个答案做出的贡献。


PS:如果其他人想添加有关 的其他信息FPE_INTOVF,他们可能会发布此问题的另一个答案,或者他们可能会对此答案发表评论,我将编辑答案以添加其他信息。

于 2021-10-17T16:38:58.657 回答