Правило 22.8 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>

double val = 0.0;

void f ( void )
{
    val = strtod("1.0",NULL); /* Non-compliant */
    if ( 0 == errno ) /* Check errno for nonzero values */
    {
        val = strtod("1.0",NULL); /* Compliant - case 1*/
        if ( 0 == errno ) /* Check errno for nonzero values */
        {
        }
    }
    else
    {
        errno = 0;
        val = strtod("1.0",NULL); /* Compliant - case 2*/
        if ( 0 == errno ) /* Check errno for nonzero values */
        {
        }
    }
}

В этом примере нарушено правило, когда strtod называется, но errno не сбрасывается до вызова.

Правило не нарушено в следующих случаях:

  • Случай 1: errno сравнен с нулем, и затем strtod называется в ответвлении if( 0 == errno ).

  • Случай 2: errno явным образом обнуляется, и затем strtod называется.

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

Группа: ресурсы
Категория: необходимый
Категория AGC: необходимый
Язык: C90, C99

Введенный в R2017a