Desbordamiento de búfer
Los tamaños de caracteres variables pueden causar problemas al colocar los caracteres en un búfer. Tenga en cuenta el código siguiente, que copia caracteres de una cadena, sz
, en un búfer, rgch
:
cb = 0;
while( cb < sizeof( rgch ) )
rgch[ cb++ ] = *sz++;
La pregunta es: ¿fue el último byte que se copió un byte inicial? Lo siguiente no resuelve el problema porque puede desbordar el búfer:
cb = 0;
while( cb < sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
La llamada a _mbccpy
intenta hacer lo correcto: copia el carácter completo, ya sea de 1 o 2 bytes. Pero no tiene en cuenta que el último carácter copiado podría no caber en el búfer si el carácter es de 2 bytes de ancho. La solución correcta es:
cb = 0;
while( (cb + _mbclen( sz )) <= sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
Este código comprueba si hay un posible desbordamiento del búfer en la prueba de bucle, utilizando _mbclen
para probar el tamaño del carácter actual al que apunta sz
. Al realizar una llamada a la función _mbsnbcpy
, puede reemplazar el código del bucle while
por una sola línea de código. Por ejemplo:
_mbsnbcpy( rgch, sz, sizeof( rgch ) );