Поделиться через


C6328

предупреждение C6328: Несоответствие размера: <тип> передается как параметр <номер>, когда <тип> требуется в вызове <функции>

Для символьно-ориентированных процедур среды выполнения языка C семейства isxxx() передача аргумента типа char может иметь непредсказуемые результаты.Например, однобайтовый знак типа char со значением, превышающем 0x7F, в однобайтовой или многобайтовой кодировке является отрицательным значением.Если передается значение типа char, компилятор может преобразовать это значение в значение типа int со знаком или типа long со знаком.Данное значение может быть расширено знаком компилятором, что приведет к непредвиденным результатам.Например, функция isspace принимает аргумент типа int; однако допустимые значения этого входного аргумента должны находиться в следующем диапазоне:

0 <= c <= 255 (плюс особое значение EOF).

Пример

По умолчанию char является в Visual C++ типом со знаком, то есть значения переменной типа char могут находиться в диапазоне -128 <= c <= 127.Поэтому при реализации следующего кода:

#include <iostream>

void f( )
{
    char c = -37;
    int retVal = isspace( c );
    // code ...
}

переменная c будет расширена знаком и приведена к учитывающему знак типу int со значением -37, которое находится за пределами допустимого диапазона функции isspace.

Для устранения этого предупреждения можно использовать оператор static_cast, как указано в следующем коде:

#include <iostream>

void f( )
{
    char c = -37;
    int retVal = isspace( static_cast<unsigned char> (c) );
    // code ...
}

Предупреждение C6328 специально предназначено для обнаружения этой ошибки.Для символов в 7-битовом диапазоне ASCII приведение не нужно, но символы вне диапазона могут привести к непредсказуемым результатам вплоть до ошибки программы и её завершения.