在执行期间检测下溢

Posted

技术标签:

【中文标题】在执行期间检测下溢【英文标题】:Detecting underflow during execution 【发布时间】:2011-04-22 04:14:53 【问题描述】:

有没有办法在执行过程中自动检测下溢?

具体来说,我认为应该有一个编译器选项来生成代码,在可能导致它们的数学运算之后立即检查下溢和类似错误。

我说的是 G++ 编译器。

【问题讨论】:

【参考方案1】:

C99/C++11 具有浮点控制函数(例如fetestexcept)和定义的标志(包括FE_UNDERFLOW),它们应该可以让您合理便携地检测浮点下溢(即,使用任何支持这些的编译器/库) )。

虽然它们不那么可移植,但 gcc 有一个 feenableexcept 可以让您设置被捕获的浮点异常。当您启用的异常之一触发时,您的程序将收到SIGFPE 信号。

至少在大多数硬件上,整数运算没有等价物——下溢只会产生一个 2 的补码(或其他)结果,并且(例如)设置标志(例如,进位和符号位)以表明发生了什么. C99/C++11 确实有一些标志用于整数溢出等问题,但我认为它们几乎没有得到广泛支持。

【讨论】:

@Mehrdad - C++11 是下一个 C++ 标准,目前由 ISO 成员国考虑,预计将在今年晚些时候被接受。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3290.pdf @Bo:我还以为是C++0x? @Merdad - 这是同一个,只是我们现在知道 x 是什么并且工作已经完成。 @Mehrdad:C++0x 在成为标准之前是非官方名称。我会继续这样称呼它,直到我确定它不会是 C++12。 非常感谢,正是我正在寻找的!此外,可以通过编程方式处理该信号:cplusplus.com/reference/clibrary/csignal/signal

以上是关于在执行期间检测下溢的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 Ansible playbook 在执行期间挂起的原因

unity——长时间不操作检测

C/FORTRAN 将双下溢设置为零

异常处理

.Net中使用com组件后发生System.ArithmeticException异常的解决办法(Message=算术运算中发生溢出或下溢。)

FreeRTOS独立看门狗检测任务执行状态