C6328

avviso C6328: Mancata corrispondenza di dimensione: <type> viene passato come parametro <number> quando <type> è obbligatorio nella chiamata a <function>

Per le routine basate su carattere runtime c il cognome isxxx(), passare un argomento di tipo char può produrre risultati imprevisti.Ad esempio, un carattere a byte singolo SBCS o MBCS di tipo char con un valore maggiore di 0x7F è un valore negativo.Se viene passato un tipo char, il compilatore potrebbe convertire il valore in un int o long con segno.Il valore potrebbe essere esteso con segno dal compilatore, con risultati non previsti.isspace, ad esempio, accetta un argomento di tipo int. Tuttavia, l'intervallo di valori validi per l'argomento di input è:

0 <= c <= 255, più il valore speciale EOF.

Esempio

Per impostazione predefinita, char è un tipo con segno in Visual C++, pertanto l'intervallo di valori di una variabile di tipo char è -128 <= c <= 127.Pertanto, se è stato eseguito quanto segue:

#include <iostream>

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

c sarebbe esteso con segno a un tipo int con segno con un valore -37, esterno all'intervallo valido per isspace.

Per risolvere questo problema, utilizzare static_cast, come illustrato nel codice seguente:

#include <iostream>

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

L'avviso C6328 è stato creato in maniera specifica per il rilevamento di questo bug.Per i caratteri nell'intervallo ASCII a 7 bit il cast è esterno di caratteri necessario, tuttavia che l'intervallo può produrre risultati imprevisti, fino all'errore e la chiusura del programma.