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