Правило 22.9 MISRA C:2012

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

Описание

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

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

Объяснение

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

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

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

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

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

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

Обменивайтесь сообщениями в отчете

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

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

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

Примеры

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

#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: необходимый
Язык: C90, C99

Введенный в R2017a