Condividi tramite


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, , szin 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 szcui 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 ) );

Vedi anche

Suggerimenti sulla programmazione MBCS