Delen via


Bufferoverloop

Verschillende tekengrootten kunnen problemen veroorzaken wanneer u tekens in een buffer plaatst. Houd rekening met de volgende code, waarmee tekens uit een tekenreeks worden gekopieerd, szin een buffer: rgch

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

De vraag is: Was de laatste gekopieerde byte een lead-byte? Het volgende lost het probleem niet op omdat het mogelijk de buffer overloopt:

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

De _mbccpy aanroep probeert het juiste te doen: kopieer het volledige teken, ongeacht of het 1 of 2 bytes is. Maar er wordt niet rekening mee gehouden dat het laatste gekopieerde teken mogelijk niet in de buffer past als het teken 2 bytes breed is. De juiste oplossing is:

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

Met deze code wordt getest op een mogelijke bufferoverloop in de lus, waarbij _mbclen wordt gebruikt om de grootte van het huidige teken te testen waar sz naar wijst. Door een aanroep naar de _mbsnbcpy functie te maken, kunt u de code in de while lus vervangen door één regel code. Voorbeeld:

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

Zie ook

MBCS-programmeertips