# V739. EOF should not be compared with a value of the 'char' type. Consider using the 'int' type.

Анализатор обнаружил, что константа EOF сравнивается с переменной типа 'char' или 'unsigned char'. Это свидетельствует о том, что некоторые символы будут обрабатываться программой неверно.

Рассмотрим, как объявлен EOF:

    #define EOF (-1)

Как видите, EOF есть ни что иное как '-1' типа 'int'. Посмотрим, к каким последствиям это может приводить. Первый пример:

    unsigned char c;
    while ((c = getchar()) != EOF)
      { .... }

Беззнаковая переменная 'c' никогда не будет равна отрицательному значению '-1'. Поэтому выражение ((c = getchar) != EOF) всегда истинно, и возникает вечный цикл. Такая ошибка будет сразу замечена и исправлена. Поэтому не будем продолжать обсуждать тип 'unsigned char'.

Рассмотрим более интересный случай:

    signed char c;
    while ((c = getchar()) != EOF)
      { .... }

Функция getchar() возвращает значения типа 'int'. А именно - она может вернуть число от 0 до 255 или -1 (EOF). Прочитанные значение помещаются в переменную типа 'char'. Из-за этого символ со значением 0xFF (255) превращается в -1 и интерпретируется точно также как конец файла (EOF).

Пользователи, использующие Extended ASCII Codes, иногда сталкиваются с ошибкой, когда один из символов их алфавита некорректно обрабатывается программами.

Например, последняя буква русского алфавита в кодировке Windows-1251 как раз имеет код 0xFF и воспринимается некоторыми программами как конец файла.

Исправленный вариант кода:

    int c;
    while ((c = getchar()) != EOF)

Данная диагностика классифицируется как:

CWE-20 CERT-INT31-C

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V739.