MISRA C:2012 Rule 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.

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

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