exponenta event banner

CERT C: FIO34-C правил

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

Описание

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

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

Внедрение Polyspace

Эта проверка проверяет значение символа, поглощенное EOF.

Примеры

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

Проблема

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

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

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

  • Wide-End-of-File: выполняется преобразование типа данных, которое позволяет преобразовать значение не-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;
    }
}

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

Группа: Правило 09. Входной выход (FIO)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.