ПроблемаНеправильное использование расширенных знаков значения происходит при преобразовании знака или простого char тип данных для более широкого целочисленного типа данных с расширением знака. Затем вы используете получившееся значение расширения знака как индекс массива, для сравнения с EOF или как аргумент функции обработки символов.
РискСравнение с EOF: Предположим, ваш компилятор реализует простую char введите как подписано. В этой реализации символ с десятичной формой 255 (-1 в форме дополнения двух) сохранен как значение со знаком. Когда вы преобразуете char переменная к более широкому типу данных int например, бит знака сохраняется (расширение знака). Это расширение знака приводит к тому, что символ с десятичной формой 255 преобразуется в целое число -1, которое невозможно отличить от EOF.
Использование в качестве индекса массива: По подобным аргументам вы не можете использовать расширенный знак char переменные как индекс массива. Если бит знака сохранен, преобразование из char на int может привести к отрицательным целым числам. Для индекса массива необходимо использовать положительные целочисленные значения.
Аргумент в функцию обработки символов: По подобным аргументам вы не можете использовать расширенный знак char переменные как аргументы в функции обработки символов, объявленные в ctype.h, для образца, isalpha() или isdigit(). Согласно стандарту C11 (Раздел 7.4), если вы задаете целочисленный аргумент, который не может быть представлен как unsigned char или EOF, результат поведения не определен.
ЗафиксироватьПеред преобразованием в более широкий целочисленный тип данных приведите char со знаком или просто значение явно для unsigned char.
Пример - Значение расширенного символа знака по сравнению с EOF#include <stdio.h>
#include <stdlib.h>
#define fatal_error() abort()
extern char parsed_token_buffer[20];
static int parser(char *buf)
{
int c = EOF;
if (buf && *buf) {
c = *buf++;
}
return c;
}
void func()
{
if (parser(parsed_token_buffer) == EOF) {
/* Handle error */
fatal_error();
}
}В этом примере функция parser может пройти через строку вход buf. Если символ в строке имеет десятичную форму 255, при преобразовании в int переменная c, его значение становится -1, что неотличимо от EOF. Более позднее сравнение с EOF может привести к ложному положению.
Коррекция - Приведение к unsigned char Перед преобразованиемОдной из возможных коррекций является приведение простого char значение в unsigned char перед преобразованием в более широкий int тип.
#include <stdio.h>
#include <stdlib.h>
#define fatal_error() abort()
extern char parsed_token_buffer[20];
static int parser(char *buf)
{
int c = EOF;
if (buf && *buf) {
c = (unsigned char)*buf++;
}
return c;
}
void func()
{
if (parser(parsed_token_buffer) == EOF) {
/* Handle error */
fatal_error();
}
}