exponenta event banner

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

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

Описание

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

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

Это правило основано на 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>

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 вызывается.

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

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