Sdílet prostřednictvím


Přetečení vyrovnávací paměti

Různé velikosti znaků mohou způsobit potíže, pokud umístíte znaky do vyrovnávací paměti. Vezměme si následující kód, který kopíruje znaky z řetězce sz do vyrovnávací paměti rgch:

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

Otázkou je: Byl poslední bajt zkopírován vedoucím bajtem? Tímto není problém vyřešen, protože může potenciálně přetéct vyrovnávací paměť:

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

_mbccpy volání pokusí udělat správnou věc – znak úplně zkopírovat, jestli je 1 nebo 2 bajty. Neberte ale v úvahu, že zkopírování posledního znaku nemusí vyhovovat vyrovnávací paměti, pokud je znak široky 2 bajty. Správným řešením je:

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

Tento kód přetečení vyrovnávací paměti je možný při zkoušce smyčky, pomocí _mbclen testování velikosti současného znaku ukazuje na sz. Voláním _mbsnbcpy funkce, můžete nahradit kód ve while smyčce s jedním řádkem kódu. Příklad:

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

Viz také

Koncepty

Programovací tipy znakové sady MBCS