Estouro de buffer
Variados tamanhos de caracteres podem causar problemas quando você colocar 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 copiado um byte inicial?O seguinte resolver o problema porque ele pode potencialmente 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 caractere completo, se é 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 é 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 );
}
Testa este código de estouro de buffer possível loop teste usando _mbclen para testar o tamanho do caractere atual apontado 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.Por exemplo:
_mbsnbcpy( rgch, sz, sizeof( rgch ) );