ISO/IEC TS 17961 [chreof]

Используя символьные значения, которые неотличимы от EOF

Описание

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

Используя символьные значения, которые неотличимы от EOF. [1]

Реализация Polyspace

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

Примеры

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

Проблема

Символьное значение, поглощенное в 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;
    }
}

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

Разрешимость: неразрешимый

Введенный в R2019a


[1]  Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.