MISRA C:2012 Rule 22.10

Значение errno буду только протестирован, когда последней функцией, которая будет названа, был errno- установка функции

Описание

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

Значение errno буду только протестирован, когда последней функцией, которая будет названа, был errno- установка функции.

Объяснение

Помимо errno- устанавливая функции, Стандарт не осуществляет тот другой, функции устанавливают errno при ошибках. Устанавливают ли эти функции errno или не является зависящим от реализации.

Обнаружить ошибки, если вы проверяете errno один, валидность этой проверки также становится зависящей от реализации. На реализациях, которые не требуют errno установка, даже если вы проверяете errno один, можно пропустить состояние ошибки.

Для списка errno- установка функций, смотрите MISRA C:2012 Rule 22.8.

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

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

Примеры

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

#include <stddef.h>
#include <stdlib.h>

typedef double float64_t;

void f(void)
{
    float64_t f64;
    errno = 0;
    f64 = atof("A.12");
    if (0 == errno) { /* Non-compliant */
    }
    errno = 0;
    f64 = strtod("A.12", NULL);
    if (0 == errno) { /* Compliant */
    }
}

В этом примере:

  • Первый if оператор несовместим потому что atof май или не может установить errno когда ошибка обнаруживается. f64 может не иметь допустимого значения в этом if оператор.

  • Второй if оператор совместим потому что strtod errno- установка функции. f64 будет иметь допустимое значение в этом if оператор.

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

Группа: ресурсы
Категория: необходимый
Категория AGC: необходимый
Введенный в R2017a