Desbordamiento de búfer

La variación de los tamaños de caracteres puede ocasionar problemas al colocar caracteres en un búfer.Observe 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 cuestión es: ¿Se ha copiado el último byte en el byte inicial?La siguiente estructura no soluciona el problema, porque puede desbordar el búfer potencialmente:

cb = 0;
while( cb < sizeof( rgch ) )
{
    _mbccpy( rgch + cb, sz );
    cb += _mbclen( sz );
    sz = _mbsinc( sz );
}

La llamada a _mbccpy intenta realizar lo correcto: copia el carácter completo, ya sean 1 o 2 bytes.Pero no tiene en cuenta que el último carácter copiado puede no ajustarse al tamaño del búfer si el carácter tiene un ancho de 2 bytes.La solución correcta es la siguiente:

cb = 0;
while( (cb + _mbclen( sz )) <= sizeof( rgch ) )
{
    _mbccpy( rgch + cb, sz );
    cb += _mbclen( sz );
    sz = _mbsinc( sz );
}

Este código prueba el posible desbordamiento del búfer en la prueba del bucle, y utiliza _mbclen para probar el tamaño del carácter actual al que apunta sz.Mediante una llamada a la función _mbsnbcpy, se puede sustituir el código del bucle while con una sola línea de código.Por ejemplo:

_mbsnbcpy( rgch, sz, sizeof( rgch ) );

Vea también

Conceptos

Sugerencias de programación para MBCS