Dela via


Buffertspill

Olika teckenstorlekar kan orsaka problem när du placerar tecken i en buffert. Tänk på följande kod, som kopierar tecken från en sträng, , sztill en buffert, rgch:

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

Frågan är: Kopierades den senaste bytet en leadbyte? Följande löser inte problemet eftersom det potentiellt kan spilla över bufferten:

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

Anropet _mbccpy försöker göra rätt – kopiera tecknet i sin helhet, oavsett om det är 1 eller 2 byte. Men det tar inte hänsyn till att det sista tecknet som kopieras kanske inte passar bufferten om tecknet är 2 byte brett. Rätt lösning är:

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

Den här koden testar möjliga buffertöverflöden i looptestet med hjälp av _mbclen för att testa storleken på det aktuella tecknet som pekas på av sz. Genom att göra ett anrop till _mbsnbcpy funktionen kan du ersätta koden i loopen while med en enda kodrad. Till exempel:

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

Se även

MBCS-programmeringstips