是否可以通过 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
抛出异常。但是 SIGFPE
的 FPE_INTOVF
值是一种暗示,它可能让主机在整数溢出的情况下抛出(就像它已经对整数除以零所做的那样)。
问题:
FPE_INTOVF
是不是不能用了?它只是一种信号类型的占位符,没有 POSIX 兼容 OS 曾经实现过吗?或者是否可以指示 OS 在整数溢出的情况下抛出这种信号?
我对使用 sigaction()
.
从 C 程序捕获 FPE_INTOVF
信号非常感兴趣
P.S.: 我认识到无符号整数溢出在技术上不是 C 中的错误(它在 C 中根本不存在,因为所有无符号整数运算都有“包装”行为),但是 signed 整数溢出确实是未定义的行为,所以我希望 FPE_INTOVF
处理后者。
长话短说:
SIGFPE FPE_INTOVF
类型的异常似乎只有在底层硬件支持它们时才会被抛出。例如,在 Linux 上,这些是可能会抛出 FPE_INTOVF
的拱门:alpha
、ia64
、m68k
、mips
、parisc
、s390
和 superh
.
不是我问题的答案,但值得注意:
我的问题特别是关于 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 对此问题的另一个答案,或者他们可能会对此发表评论回答,我将编辑答案以添加其他信息。
我觉得这是一个愚蠢的问题,但我发现了 零 个关于该主题的信息(不在这里也不在任何地方),所以问题是:
上下文(您可能已经知道):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
抛出异常。但是 SIGFPE
的 FPE_INTOVF
值是一种暗示,它可能让主机在整数溢出的情况下抛出(就像它已经对整数除以零所做的那样)。
问题:
FPE_INTOVF
是不是不能用了?它只是一种信号类型的占位符,没有 POSIX 兼容 OS 曾经实现过吗?或者是否可以指示 OS 在整数溢出的情况下抛出这种信号?
我对使用 sigaction()
.
FPE_INTOVF
信号非常感兴趣
P.S.: 我认识到无符号整数溢出在技术上不是 C 中的错误(它在 C 中根本不存在,因为所有无符号整数运算都有“包装”行为),但是 signed 整数溢出确实是未定义的行为,所以我希望 FPE_INTOVF
处理后者。
长话短说:
SIGFPE FPE_INTOVF
类型的异常似乎只有在底层硬件支持它们时才会被抛出。例如,在 Linux 上,这些是可能会抛出 FPE_INTOVF
的拱门:alpha
、ia64
、m68k
、mips
、parisc
、s390
和 superh
.
不是我问题的答案,但值得注意:
我的问题特别是关于 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 对此问题的另一个答案,或者他们可能会对此发表评论回答,我将编辑答案以添加其他信息。