exponenta event banner

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

Макрос EOF сравнивается только с неизмененным возвращаемым значением из любой Стандартной библиотечной функции, способной возвращать EOF

Описание

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

Макрос EOF сравнивается только с неизмененным возвращаемым значением из любой стандартной библиотечной функции, способной к возврату EOF.

Это правило основано на MISRA C ®: 2012 Поправка 1.

Объяснение

EOF значение может стать неотличимым от допустимого кода символа, если возвращенное значение преобразуется в другой тип. В таких случаях проверка преобразованного значения на соответствие EOF не позволяет достоверно определить, был ли достигнут конец файла или произошла ошибка.

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

развернуть все

#include <stdio.h>
#include <stdint.h>

void f1(void)
{
    char ch;
    ch = (char) getchar();
    if (EOF != (int32_t) ch) {    /* Non-compliant */
    }
}

void f2(void)
{
    char ch;
    ch = (char) getchar();
    if (!feof(stdin)) {           /* Compliant */
    }
}

void f3(void)
{
    int32_t i_ch;
    i_ch = getchar();
    if (EOF != i_ch) {            /* Compliant */
        char ch;
        ch = (char) i_ch;
    }
}

В этом примере:

  • Тест в f1 функция несовместима. Он не будет надежным, так как возвращаемое значение преобразуется в более узкий тип перед проверкой EOF.

  • Тест в f2 функция совместима. Это показывает, как feof() может использоваться для проверки EOF когда возвращаемое значение от getchar() был подвергнут преобразованию типа.

  • Тест в f3 функция совместима. Он надежен, так как при проверке используется непроверенное возвращаемое значение EOF.

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

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