MISRA C:2012 Rule 22.8

Значение 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>

double val = 0.0;

void f ( void )
{
    val = strtod("1.0",NULL);/*errno is not checked*/ 
    if ( 0 == errno ) /* Non-compliant*/
    {
        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: необходимый
Введенный в R2017a