Partilhar via


Estouro de buffer

Os tamanhos de caracteres de negócio podem causar problemas quando você coloca caracteres em um buffer. Considere o seguinte código, 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 é: Era o byte o último copiado um byte inicial? O a seguir não resolve o problema porque podem potencialmente transbordar o buffer:

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

As tentativas de chamada de _mbccpy de uma maneira correta — copiar o caractere completo, se for 1 ou 2 bytes. Mas não considerar que o último caractere copiado não pode ajustar o buffer se o caractere é de 2 bytes de comprimento. A solução é correta:

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

Os testes deste código para o buffer possível estouro no teste de loop, usando _mbclen para testar o tamanho atual de caracteres apontada por sz. Fazendo uma chamada à função de _mbsnbcpy , você pode substituir o código no loop de while com uma única linha de código. Por exemplo:

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

Consulte também

Conceitos

Dicas de programação MBCS