ПроблемаЗначение символа, поглощаемое в 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;
}
}