浮点异常-gcc错误?

| 考虑以下代码:
#include <fenv.h>
#include <stdio.h>
int main()
{
    #pragma STDC FENV_ACCESS ON
    1.0/0.0;
    printf(\"%x\\n\", fetestexcept(FE_ALL_EXCEPT));
}
我希望它会打印一个对应于ѭ1corresponding的非零值,但它会打印0。将
main
的第二行更改为
double x = 1.0/0.0;
可以得到预期的行为。这是允许的,还是错误? 编辑:对于它的价值,起初似乎在大多数现实世界代码中,可能导致fenv异常引发的操作无法进行优化,因此可以安全地执行大型计算并检查结束是否发生任何溢出,零除等。但是,当您考虑进行内联和优化时,事情会变得一团糟,并且出现了一个真正的问题。如果这样的函数在由于常数参数而最终总是被零除的情况下被内联,则gcc可能会变得非常聪明,并在不引发任何异常的情况下将整个内联函数实质上优化为4。     
已邀请:

bab

        这是预期的行为。 gcc不会对表达式求值,因为事后它将与表达式无关。 如果使用\“-Wall \”进行编译,则会警告您该语句无效,并且会忽略pragma语句。 GCC不完全符合C99。有关更多信息,请参见: http://gcc.gnu.org/c99status.html 有关实现此行为的问题,请参见:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20785     
        这是一个灰色区域。严格阅读该标准的浮点环境部分可能会轻易导致人们认为这是一个错误。我怀疑GCC维护者会不同意这一说法。 因此,我不确定GCC甚至声称了解FENV_ACCESS编译指示。当然,早期版本没有。     
        在gcc 4.6.0上使用
-Wall
进行编译时表示:
f.c:5:0: warning: ignoring #pragma FENV_ACCESS ON [-Wunknown-pragmas]
根据GCC信息页面:
* `The default state for the `FENV_ACCESS\' pragma (C99 7.6.1).\'

 This pragma is not implemented, but the default is to \"off\" unless
 `-frounding-math\' is used in which case it is \"on\".
不幸的是,ѭ8对您的程序似乎没有任何影响。 可以说是编译器错误;我想问一个GCC邮件列表。     
        您的编译器可能已经优化了原始版本。认识到两个常量在任何非平凡意义上都不是“已使用”,因此它甚至可能不存在于编译的二进制文件中。 第二个示例通过将操作实际分配给变量来改变这种情况。     
        我认为在第一种情况下该表达式已被优化,但在第二种情况下则没有。我可以用gcc 4.2和
gcc -O0
来重现您的结果,但是如果我转到
gcc -O3
则在两种情况下我都得到0。     

要回复问题请先登录注册