Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Tamanhos de caracteres variáveis 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 copiado foi um byte principal? O seguinte não resolve o problema porque pode potencialmente estourar o buffer:
cb = 0;
while( cb < sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
A _mbccpy chamada tenta fazer a coisa correta — copiar o caractere completo, seja ele de 1 ou 2 bytes. Mas isso não leva em conta que o último caractere copiado pode não caber no buffer se o caractere tiver 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 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 à função _mbsnbcpy, pode substituir o código no loop while por uma única linha de código. Por exemplo:
_mbsnbcpy( rgch, sz, sizeof( rgch ) );