C6328
Actualización: noviembre 2007
C6328
Advertencia C6328: <tipo> pasado como parámetro <número> cuando <tipo> es necesario para llamar a <función>
Para las rutinas que se inician con is*, al pasar un argumento de tipo char, se podrían producir resultados imprevisibles. Por ejemplo, un carácter de un solo byte de SBCS o MBCS de tipo char con un valor mayor que 0x7F es negativo. Si se pasa char, el compilador podría convertir el valor en un int con signo o un longcon signo. El compilador podría agregar a este valor la extensión de signo, lo que provocaría resultados inesperados. Por ejemplo, isspace acepta un argumento de tipo int; sin embargo, el intervalo válido de valores para su argumento de entrada es:
0 <= c <= 255, más el valor especial EOF.
Ejemplo
De manera predeterminada, char es un tipo con signo en Visual C++, de manera que el intervalo de valores del tipo char es -128 <= c <= 127. En consecuencia, si hiciera lo siguiente:
#include <iostream>
void f( )
{
char c = -37;
int retVal = isspace( c );
// code...
}
Se agregaría a c la extensión de signo para convertirlo en un int con signo cuyo valor sería -37, que está fuera del intervalo válido para isspace.
Para corregir este problema, utilice static_cast como se muestra en el código siguiente:
#include <iostream>
void f( )
{
char c = -37;
int retVal = isspace( static_cast<unsigned char> (c) );
// code...
}
La advertencia C6328 se ha creado específicamente para detectar este error. Para los caracteres comprendidos en el intervalo ASCII de 7 bits, la conversión de tipos es innecesaria, pero los caracteres que se encuentran fuera de ese intervalo provocarán aserciones y/o bloqueos en tiempo de ejecución.