Estouro de buffer
Diversos tamanhos de caractere podem causar problemas quando você colocar caracteres em um buffer.Considere o código a seguir, que copia 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 copiado um byte inicial?A seguir não resolve o problema porque ele potencialmente pode estourar o buffer:
cb = 0;
while( cb < sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
The _mbccpy tentativas de telefonar fazer a coisa correta — Copiar caractere completo, independentemente de ser 1 ou 2 bytes. Mas ele não levar em conta que o último caractere copiado pode não caber no buffer se o caractere for 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 estouro de buffer possível para o teste de loop, usando _mbclen Para testar o dimensionar do caractere corrente indicada por sz. Fazendo uma telefonar para o _mbsnbcpy função, você pode substituir o código a while Faça um loop com uma única linha de código. Por exemplo:
_mbsnbcpy( rgch, sz, sizeof( rgch ) );