Udostępnij za pośrednictwem


Przepełnienie buforu

Zróżnicowanie wielkości znaków może powodować problemy podczas znaków można umieścić w buforze.Należy wziąć pod uwagę następujący kod, który kopiuje znaki z ciągu, sz, do buforu, rgch:

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

Pytanie brzmi: został skopiowany ostatni bajt bajt wiodący?Następujące czynności nie rozwiązuje problemu, ponieważ może potencjalnie przepełnieniem buforu:

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

_mbccpy Wywołanie próbuje wykonać poprawne rzeczy — skopiować pełną znak, czy jest to 1 lub 2 bajtów.Ale nie jest brana pod uwagę, że ostatni znak kopiowane mogą nie mieścić buforu, jeśli znak jest szeroki 2 bajty.Właściwym rozwiązaniem jest:

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

Ten kod testy przepełnienie buforu możliwe pętli badanie, przy użyciu _mbclen do testowania rozmiar bieżący znak wskazywanego przez sz.Poprzez wywołanie _mbsnbcpy funkcji, można zastąpić kod w while pętli za pomocą jednej linii kodu.Na przykład:

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

Zobacz też

Koncepcje

Porady dotyczące programowania MBCS