让我们采取以下程序:
#include <stdio.h>
#include <fenv.h>
int main (void)
{
fenv_t e;
printf ("%d\n", fegetexcept () & FE_INVALID ? 1 : 0);
feenableexcept (FE_INVALID);
printf ("%d\n", fegetexcept () & FE_INVALID ? 1 : 0);
fegetenv (&e);
printf ("%d\n", fegetexcept () & FE_INVALID ? 1 : 0);
fesetenv (&e);
printf ("%d\n", fegetexcept () & FE_INVALID ? 1 : 0);
}
我希望它输出“0 1 1 1”:即,一旦我启用FE_INVALID
异常,对 的调用fegetenv
或fesetenv
使用相同的环境不应修改它。
这在 i386-linux 上按预期工作,但在 x86_64-linux(在 64 位模式下)上,我得到“0 1 0 1”。也就是说,调用fegetenv
清除异常掩码。
我看不到任何记录它的地方,甚至没有看到 C99 下允许的行为。我可以在glibc-2.5和glib-2.13下确认。
有人可以在最近的 glibc 上对其进行测试吗?我认为这是一个错误是正确的吗?