C6328
Avertissement C6328 : <type> passé comme paramètre <numéro> lorsque <type> est requis dans l'appel à <fonction>
Pour les routines commençant par is*, le passage d'un argument de type char peut générer des résultats imprévisibles. Par exemple, un caractère à octet unique SBCS ou MBCS de type char avec une valeur supérieure à 0x7F est négatif. Si char est passé, le compilateur peut convertir la valeur en un int signé ou un long signé. Cette valeur peut être définie sur un type signe étendu par le compilateur, avec des résultats inattendus. Par exemple, isspace accepte un argument de type int ; toutefois, la plage de valeurs valide pour son argument d'entrée est :
0 <= c <= 255, plus la valeur spéciale EOF.
Exemple
Par défaut, char est un type signé en Visual C++, de sorte que la plage de valeurs d'une variable de type char est -128 < = c < = 127. Par conséquent, si vous avez effectué les opérations suivantes :
#include <iostream>
void f( )
{
char c = -37;
int retVal = isspace( c );
// code...
}
c est de type signe étendu pour un int signé avec la valeur -37, qui figure à l'extérieur de la plage valide pour isspace.
Pour corriger ce problème, utilisez static_cast, comme indiqué dans le code suivant :
#include <iostream>
void f( )
{
char c = -37;
int retVal = isspace( static_cast<unsigned char> (c) );
// code...
}
L'avertissement C6328 existe spécifiquement pour intercepter ce bogue. Pour les caractères contenus dans la plage ASCII de 7 bits, le cast est inutile, mais les caractères à l'extérieur de cette plage provoquent des assertions et/ou des blocages au moment de l'exécution.