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.