Partilhar via


Estouro de buffer

Diversos tamanhos de caracteres podem causar problemas quando você coloca os caracteres em um buffer. Considere o seguinte código copia os caracteres de uma seqüência de caracteres, sz, em um buffer rgch:

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

A pergunta é: Foi o último byte copiados de um byte inicial? O seguinte resolve o problema porque ele pode potencialmente de estouro de buffer:

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

O _mbccpy chamada tentar fazer a coisa correta — copiar o caractere completo, independentemente de ser 1 ou 2 bytes. Mas ele não leva em conta que o último caractere copiado pode não caber no buffer se o caractere é de 2 bytes de largura. 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 estouro de buffer de possíveis no loop de teste, usando _mbclen para testar o tamanho do atual caracteres apontada por sz. Fazendo uma chamada para o _mbsnbcpy função, você pode substituir o código de while loop com uma única linha de código. For example:

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

Consulte também

Conceitos

Dicas de programação de MBCS