﻿# V2634\. MISRA\. Features from <fenv\.h\> should not be used\.

Данное диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Правило актуально только для языка С\. 

Не следует использовать функции или макросы из заголовочного файла `<fenv.h>`\. В некоторых ситуациях поведение программы может быть не уточнено или даже не определено при использовании функционала из этого файла\.

Рассмотрим некоторые проблемы, которые могут возникать при использовании функционала `<fenv.h>`\.

**Проблема N1**\. Порядок, в котором выставляются флаги исключений при работе с вещественными числами, при вызове функции [`feraiseexcept`](https://en.cppreference.com/w/c/numeric/fenv/feraiseexcept) не уточнён\.

**Проблема N2**\. Поведение не определено при вызове функций [`fesetenv`](https://en.cppreference.com/w/c/numeric/fenv/feenv) и/или [`feupdateenv`](https://en.cppreference.com/w/c/numeric/fenv/feupdateenv) с аргументом, который не был получен путём вызова [`feholdexcept`](https://en.cppreference.com/w/c/numeric/fenv/feholdexcept) / [`fegetenv`](https://en.cppreference.com/w/c/numeric/fenv/feenv) или раскрытия макроса [`FE_DFL_ENV`](https://en.cppreference.com/w/c/numeric/fenv/FE_DFL_ENV)\.

**Проблема N3**\. Некоторые реализации функции из заголовочного файла `<math.h>` поддерживают округление вещественных чисел только до ближайшего представимого значения \([`FE_TONEAREST`](https://en.cppreference.com/w/c/numeric/fenv/FE_round)\)\. Если был установлен другой режим округления, то поведение при вызове таких функций может быть непредсказуемым\.

Примеры, на которых анализатор выдаст срабатывания:

```cpp
void clear_overflow_status()
{
  feclearexcept(FE_OVERFLOW);
}

void change_rounding_direction()
{
  fesetround(FE_DOWNWARD);
}

double some_computation(void)
{
  int r = feraiseexcept(FE_OVERFLOW | FE_INEXACT);
  printf("feraiseexcept() %s\n", (r?"fails":"succeeds"));
  return 0.0;
}
```