MISRA C:2012 Rule 22.7

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

Описание

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

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

Это правило получено от MISRA C®: 2012 1 о внесении изменений.

Объяснение

The 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.

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

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