Udostępnij przez


Przepełnienie buforu

Różne rozmiary znaków mogą powodować problemy podczas umieszczania znaków w buforze. Rozważmy następujący kod, który kopiuje znaki z ciągu , szdo buforu, rgch:

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

Pytanie brzmi: Czy ostatni bajt skopiował bajt ołowiu? Następujące polecenie nie rozwiązuje problemu, ponieważ może on potencjalnie przepełnić bufor:

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

Wywołanie _mbccpy próbuje wykonać prawidłową czynność — skopiuj pełny znak, niezależnie od tego, czy jest to 1, czy 2 bajty. Nie uwzględnia jednak, że ostatni skopiowany znak może nie mieścić się w buforze, jeśli znak ma 2 bajty szerokości. Poprawne rozwiązanie to:

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

Ten kod testuje możliwe przepełnienie buforu w teście pętli, używając polecenia _mbclen w celu przetestowania rozmiaru bieżącego znaku wskazywanego przez sz. Wykonując wywołanie _mbsnbcpy funkcji, możesz zastąpić kod w while pętli pojedynczym wierszem kodu. Na przykład:

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

Zobacz też

Porady dotyczące programowania MBCS