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


C6328

предупреждение C6328: Несоответствие размера. объект <type> в качестве параметра <number>, если <type> является обязательным при вызове функции <function>

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

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

Пример

По умолчанию char тип со знаком в Visual C#, 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 7-битовом диапазоне ASCII в диапазоне приведение без лишних, но диапазон символов, может иметь непредсказуемые результаты вплоть до и включение ошибку и завершение программы.