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 ) );