CERT C++: FIO34-C

Различайте символы, считанные из файла и EOF или WEOF

Описание

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

Различайте символы, считанные из файла и EOF или WEOF. [1]

Примеры

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

Описание

Символьное значение, поглощенное в EOF, происходит, когда вы выполняете преобразование типа данных, которое делает значение допустимого символа неотличимым от EOF (Конец Файла). Средство поиска ошибки отмечает дефект в одной из следующих ситуаций:

  • Конец файла: Вы выполняете преобразование типа данных такой как от int до char, который преобразовывает non-EOF символьное значение в EOF.

    char ch = (char)getchar()
    Вы затем сравниваете результат с EOF.
    if((int)ch == EOF)
    Преобразование может быть явным или неявным.

  • Широкий Конец Файла: Вы выполняете преобразование типа данных, которое может преобразовать non-WEOF значение широкого символа в WEOF, и затем сравнивать результат с WEOF.

Риск

char типа данных не может содержать значение EOF, который указывает на конец файла. Функции, такие как getchar, имеют, возвращаются, вводят int, чтобы разместить EOF. Если вы преобразовываете от int до char, значения UCHAR_MAX (значение допустимого символа) и EOF преобразован в то же значение-1, и станьте неразличимыми друг от друга. Когда вы сравниваете результат этого преобразования с EOF, сравнение может привести к ложному обнаружению EOF. Это объяснение также применяется к значениям широкого символа и WEOF.

Фиксация

Выполните сравнение с EOF или WEOF перед преобразованием.

Пример - возвращаемое значение getchar, конвертированного к char

#include <stdio.h>
#include <stdlib.h>
#define fatal_error() abort()

char func(void)
{
    char ch;
    ch = getchar();
    if (EOF == (int)ch) {
        fatal_error();
    }
    return ch;
}

В этом примере возвращаемое значение getchar неявно преобразовано в char. Если getchar возвращает UCHAR_MAX, он преобразован в-1, который неотличим от EOF. Когда вы соответствуете EOF позже, он может привести к положительной лжи.

Исправление — выполняет сравнение с EOF перед преобразованием

Одно возможное исправление должно сначала выполнить сравнение с EOF, и затем преобразовать от int до char.

#include <stdio.h>
#include <stdlib.h>
#define fatal_error() abort()

char func(void)
{
    int i;               
    i = getchar();       
    if (EOF == i) {      
        fatal_error();
    }
    else {
        return (char)i;
    }
}

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

Группа: 07. Ввод-вывод (FIO)

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.