浮点异常 - gcc bug?

R..*_*R.. 4 c floating-point standards gcc fenv

请考虑以下代码:

#include <fenv.h>
#include <stdio.h>
int main()
{
    #pragma STDC FENV_ACCESS ON
    1.0/0.0;
    printf("%x\n", fetestexcept(FE_ALL_EXCEPT));
}
Run Code Online (Sandbox Code Playgroud)

我希望它打印一个非零值对应FE_DIVBYZERO,但它打印0.更改第二行maindouble x = 1.0/0.0;给出预期的行为.这是允许的,还是一个bug?

编辑:对于它的价值,起初似乎在大多数现实世界的代码中,可能导致引发fenv异常的操作无法优化,因此可以安全地执行大型计算并在最后检查是否存在溢出,div-by-zero等发生了.但是,当您考虑内联和优化时,事情会变得混乱,并且会出现真正的问题.如果这样的函数在由于常量参数而总是最终除以零的情况下被内联,则gcc可能变得非常聪明并且基本上优化整个内联函数而return INFINITY;不会引发任何异常.

dou*_*llj 6

这是预期的行为.gcc不会评估表达式,因为之后它与之无关.

如果使用"-Wall"进行编译,它会警告您该语句无效,并且它会忽略pragma语句.

GCC不完全符合C99标准.有关更多信息,请参阅:http: //gcc.gnu.org/c99status.html

有关实现此行为的问题,请参阅:http://gcc.gnu.org/bugzilla/show_bug.cgi?id = 20785