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

Různé velikosti znaků můžou způsobit problémy při vkládání znaků do vyrovnávací paměti. Představte si následující kód, který kopíruje znaky z řetězce , szdo vyrovnávací paměti: rgch

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

Otázka: Zkopíroval poslední bajt hlavní bajt? Následující problém nevyřeší, protože může potenciálně přetékat vyrovnávací paměť:

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

Volání _mbccpy se pokusí provést správnou věc – zkopírujte celý znak, ať už je to 1 nebo 2 bajty. Nebere ale v úvahu, že poslední kopírovaný znak nemusí odpovídat vyrovnávací paměti, pokud je znak 2 bajty široký. Správné řešení je:

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

Tento kód testuje možné přetečení vyrovnávací paměti v testu smyčky pomocí _mbclen k otestování velikosti aktuálního znaku, na který szodkazuje . Voláním _mbsnbcpy funkce můžete kód ve while smyčce nahradit jedním řádkem kódu. Příklad:

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

Viz také

MBCS – tipy pro programování