Partager via


C6328

Mise à jour : novembre 2007

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 étant un type signé en Visual C++, la plage de valeurs d'une variable de caractère de type est -128 < = c < = 127. Par conséquent, si vous avez procédé comme suit :

#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.