C6328

warning C6328: Size mismatch: <type> passed as parameter <number> when <type> is required in call to <function>

For C runtime character-based routines in the family name isxxx(), passing an argument of type char can have unpredictable results. For example, an SBCS or MBCS single-byte character of type char with a value greater than 0x7F is a negative value. If a char is passed, the compiler might convert the value to a signed int or a signed long. This value could be sign-extended by the compiler, with unexpected results. For example, isspace accepts an argument of type int; however, the valid range of values for its input argument is:

0 <= c <= 255, plus the special value EOF.

Example

By default, char is a signed type in Visual C++, so the range of values of a variable of type char is -128 <= c <= 127. Therefore, if you did the following:

#include <iostream>

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

c would be sign-extended to a signed int with a value of -37, which is outside the valid range for isspace.

To correct this problem, you can use static_cast, as shown in the following code:

#include <iostream>

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

Warning C6328 exists specifically to catch this bug. For characters in the 7-bit ASCII range the cast is unnecessary, but characters outside that range can have unpredictable results, up to and including program fault and termination.