Compartir a través de


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 ) );

Consulte también

Sugerencias de programación para MBCS