Condividi tramite


C6328

avviso C6328: <tipo> passato come parametro <numero> mentre <tipo> è richiesto nella chiamata a <funzione>

Per routine che iniziano con is*, il passaggio di un argomento di tipo char potrebbe generare risultati imprevedibili. Ad esempio, un carattere a byte singolo SBCS o MBCS di tipo char con un valore maggiore di 0x7F è 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 il 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 non è necessario, tuttavia i caratteri all'esterno di quell'intervallo determineranno asserzioni e/o arresti anomali in fase di esecuzione.