MISRA C:2012 Rule 21.12

Функции обработки исключений <fenv.h> не должен использоваться

Описание

Управляйте определением

Функции обработки исключений <fenv.h> не должен использоваться.

Объяснение

В некоторых случаях значения флагов состояния с плавающей точкой не заданы. Попытки получить доступ к ним могут вызвать неопределенное поведение.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

#include <fenv.h>

void func(float x, float y) {
    float z;

    feclearexcept(FE_DIVBYZERO);              /* Non-compliant */ 
    z = x/y;

    if(fetestexcept (FE_DIVBYZERO))  {        /* Non-compliant */ 
    }
    else {
#pragma STDC FENV_ACCESS ON
        z=x*y;
        if(z>x) {
#pragma STDC FENV_ACCESS OFF
            if(fetestexcept (FE_OVERFLOW)) {  /* Non-compliant */ 
            }
        }
    }
}

В этом примере правило нарушено когда идентификаторы feclearexcept и fetestexcept, и макросы FE_DIVBYZERO и FE_OVERFLOW используются.

Проверяйте информацию

Группа: Стандартные библиотеки
Категория: консультация
Категория AGC: консультация
Введенный в R2015b