Compartilhar via


Estouro de buffer

Tamanhos variados de caracteres podem causar problemas quando você coloca caracteres em um buffer. Considere o código a seguir, que copia caracteres de uma cadeia de caracteres, sz, em um buffer, rgch:

cb = 0;
while( cb < sizeof( rgch ) )
    rgch[ cb++ ] = *sz++;

A questão é: o último byte copiou um byte inicial? O seguinte não resolve o problema porque ele pode potencialmente estourar o buffer:

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

A chamada _mbccpy tenta fazer a coisa correta – copie o caractere completo, seja 1 ou 2 bytes. Mas não leva em conta que o último caractere copiado poderá não caber no buffer se o caractere tiver 2 bytes de extensão. A solução correta é:

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

Esse código testa o possível estouro de buffer no teste de loop, usando _mbclen para testar o tamanho do caractere atual apontado por sz. Ao fazer uma chamada para a função _mbsnbcpy, você pode substituir o código no loop while por uma única linha de código. Por exemplo:

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

Confira também

Dicas de programação do MBCS