fegetenv() очищает маску исключений в x86_64-linux

Давайте возьмем следующую программу:

#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? Правильно ли я считаю, что это ошибка?

1 ответ

Ну, я подал ошибку в базе данных ошибок glibc, которая была подтверждена одним из разработчиков. Полагаю, этого достаточно, что это действительно ошибка в glibc.

Другие вопросы по тегам