ПроблемаСимвольное значение, поглощенное в EOF, происходит, когда вы выполняете преобразование типа данных, которое делает значение допустимого символа неотличимым от EOF
(Конец файла). Bug Finder отмечает дефект в одной из следующих ситуаций:
Конец файла: Вы выполняете преобразование типа данных такой как от 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;
}
}