Character value absorbed into EOF

Преобразование типа данных делает значение допустимого символа тем же самым как Конец файла (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 перед преобразованием.

Примеры

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

#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;
    }
}

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: CHAR_EOF_CONFUSED
Удар: высоко
ID CWE: 704
Введенный в R2017a