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



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

上下文(你可能已经知道):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异常被抛出。但是SIGFPEFPE_INTOVF值是一种暗示,它可能会让主机在整数溢出的情况下抛出(就像它已经为整数除零所做的那样)。

问题:

FPE_INTOVF不可用?它只是一种没有posix兼容的操作系统实现过的信号类型的占位符吗?或者是否有可能指示操作系统在整数溢出的情况下抛出这种信号?

我对使用sigaction()从C程序捕获FPE_INTOVF信号很感兴趣。


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

br:

类型SIGFPE FPE_INTOVF的异常只有在底层硬件支持时才会被抛出。例如,在Linux上,这些arch可能抛出FPE_INTOVF:alphaia64m68kmipspariscs390superh

没有回答我的问题,但值得注意:

我的问题是关于FPE_INTOVF的,但是如果一个人只是想检查一般的整数溢出,值得注意的是,有其他方法可以这样做:特定于编译器的函数,如__builtin_sadd_overflow()(在这里阅读更多)或特定于编译器的标志,如GCC上的-ftrapv

<<h3>信用/h3>我要感谢用户KamilCuk, Steve Summit和Nate Eldredge通过他们的评论为这个答案做出了贡献。


注::如果有人想要添加关于FPE_INTOVF的其他信息,他们可以发布另一个答案来回答这个问题,或者他们可以写一个评论来回答这个问题,我会编辑答案来添加额外的信息。

相关内容

  • 没有找到相关文章

最新更新