MISRA C:2012 Rule 22.8

Значение errno устанавливается в нуль перед вызовом errno-setting-function

Описание

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

Значение errno устанавливается в нуль перед вызовом errno-setting-function.

Это правило получено от 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 вызывается.

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

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