exponenta event banner

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

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

Описание

Определение правила

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

Это правило основано на MISRA C ®: 2012 Поправка 1.

Объяснение

Если ошибка возникает во время вызова errno-setting-function, функция записывает ненулевое значение в 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.

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

Группа: Ресурсы
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2017a