MISRA C:2012 Rule 22.7

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

Описание

Управляйте определением

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

Это правило прибывает из MISRA C®: 2 012 Поправок 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.

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

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