C6328
avertissement C6328 : Incompatibilité de taille : <type> passé comme paramètre <number> lorsque <type> est requise dans l'appel à <function>
Pour les routines caractère- basés sur runtime C dans le nom de famille isxxx(), passer un argument de type char peut avoir des résultats imprévisibles.Par exemple, le caractère codé sur un octet SBCS ou MBCS de type char avec une valeur supérieure à 0x7F est une valeur négative.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 signé dans Visual C++, 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 résoudre 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 7 bits de le cast est en dehors inutile, mais de caractères que l'intervalle peut avoir des résultats imprévisibles, jusqu'au défaut du programme et arrêt.