1

让我们采取以下程序:

#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异常,对 的调用fegetenvfesetenv使用相同的环境不应修改它。

这在 i386-linux 上按预期工作,但在 x86_64-linux(在 64 位模式下)上,我得到“0 1 0 1”。也就是说,调用fegetenv清除异常掩码

我看不到任何记录它的地方,甚至没有看到 C99 下允许的行为。我可以在glibc-2.5和glib-2.13下确认。

有人可以在最近的 glibc 上对其进行测试吗?我认为这是一个错误是正确的吗?

4

1 回答 1

1

好吧,我已经在 glibc 错误数据库中提交了一个错误,该错误已得到一位开发人员的确认。我想这足以证明它确实是 glibc 中的一个错误

于 2013-11-20T23:42:55.323 回答