MISRA C:2012 Rule 22.9

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

Описание

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

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

Это правило прибывает из MISRA C®: 2 012 Поправок 1.

Объяснение

Если ошибка происходит во время вызова errno- функция установки, функция пишет ненулевое значение в errno. В противном случае, errno не изменяется.

Когда errno является ненулевым, функциональное возвращаемое значение вряд ли будет правильно. Перед использованием этого возвращаемого значения необходимо протестировать errno для ненулевых значений.

Errno- устанавливающие функции включают:

  • ftell, fgetpos, fgetwc и связанные функции.

  • strtoimax, strtol и связанные функции.

    Эквиваленты широкого символа, такие как wcstoimax и wcstol также покрыты.

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

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

Примеры

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

#include <stdlib.h>
#include <errno.h>

void func(void);
double val = 0.0;

void f1 ( void )
{
  errno = 0;
  val = strtod ( "1.0", NULL ); /* Non-compliant */
  func ();

  if ( 0 != errno )
    {
    }

  errno = 0;
  val = strtod ( "1.0", NULL ); /* Compliant */
  if ( 0 == errno ) 
    {
      func();
    }
}

В этом примере правило нарушено когда errno сразу не проверяется после первого вызова strtod. Вместо этого второй функциональный func называется. func может использовать значение в глобальной переменной val. Значение может быть неправильным, если ошибка произошла во время вызова strtod.

Правило не нарушено когда errno проверяется перед операциями, которые потенциально используют возвращаемое значение strtod.

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

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