是否可以通过 SIGFPE FPE_INTOVF 在 C (POSIX/Linux) 中捕获整数溢出异常?

Is it possible to catch integer overflow exception in C (POSIX/Linux) via SIGFPE FPE_INTOVF?

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

上下文(您可能已经知道):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.

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

问题:

FPE_INTOVF是不是不能用了?它只是一种信号类型的占位符,没有 POSIX 兼容 OS 曾经实现过吗?或者是否可以指示 OS 在整数溢出的情况下抛出这种信号?

我对使用 sigaction().

从 C 程序捕获 FPE_INTOVF 信号非常感兴趣

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

长话短说:

SIGFPE FPE_INTOVF 类型的异常似乎只有在底层硬件支持它们时才会被抛出。例如,在 Linux 上,这些是可能会抛出 FPE_INTOVF 的拱门:alphaia64m68kmipspariscs390superh.

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

我的问题特别是关于 FPE_INTOVF,但如果只是想检查一般的整数溢出,值得注意的是还有其他方法可以这样做:特定于编译器的函数,如 __builtin_sadd_overflow()read more here) or compiler-specific flags like -ftrapv on GCC. Also see this and this SO 上的相关问题。

学分

我要感谢用户 KamilCuk, Steve Summit and Nate Eldredge 通过他们的评论对这个答案做出的贡献。


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