Overflow del buffer
Le dimensioni dei caratteri variabili possono causare problemi quando si inserisce caratteri in un buffer. Si consideri il codice seguente, che copia i caratteri da una stringa, , sz
in un buffer, rgch
:
cb = 0;
while( cb < sizeof( rgch ) )
rgch[ cb++ ] = *sz++;
La domanda è: L'ultimo byte è stato copiato da un byte di piombo? Di seguito non viene risolto il problema perché può potenzialmente sovraccaricare il buffer:
cb = 0;
while( cb < sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
La _mbccpy
chiamata tenta di eseguire l'operazione corretta, ovvero copiare il carattere completo, indipendentemente dal fatto che si tratti di 1 o 2 byte. Ma non tiene conto che l'ultimo carattere copiato potrebbe non adattarsi al buffer se il carattere è largo 2 byte. La soluzione corretta è:
cb = 0;
while( (cb + _mbclen( sz )) <= sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
Questo codice verifica il possibile overflow del buffer nel test del ciclo, usando _mbclen
per testare le dimensioni del carattere corrente a sz
cui punta . Effettuando una chiamata alla _mbsnbcpy
funzione, è possibile sostituire il codice nel while
ciclo con una singola riga di codice. Ad esempio:
_mbsnbcpy( rgch, sz, sizeof( rgch ) );