Partager via


C6328

Avertissement C6328 : Non-concordance de la taille <type> passé comme paramètre <numéro> lorsque <type> est requis dans l'appel à <fonction>

Pour les routines basés sur les caractères par runtime C dans le nom de famille isxxx(), transmettant un argument de type char peut produire 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, vous pouvez utiliser 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 de la plage ASCII de 7 bits la conversion n'est pas nécessaire, mais des caractères en dehors de cette plage peut produire des résultats imprévisibles, jusqu'à l'échec du programme et sa fin.