C ++ memset () overflow della memoria

3

Sono nuovo di C ++.

Qualcuno esperto di C ++ può dirmi che ciò causerebbe un overflow del buffer?

Codice di esempio:

MyObject op;
memset(&op, 0, sizeof(MyObject));

Dal mio punto di vista è ok, perché il limite è la dimensione del tipo di oggetto stesso, ma c'è un tool di sicurezza preso come overflow del buffer. Se si tratta davvero di un buffer overflow, puoi descriverlo un po 'come potrebbe essere. Grazie per il chiarimento e la spiegazione.

    
posta overshadow 25.09.2014 - 10:20
fonte

3 risposte

2

Questo è non un buffer overflow. La dimensione del buffer che stai dando a memset è esattamente la dimensione effettiva del buffer (in questo caso, l'oggetto op ).

Se questo è un oggetto C ++ con funzioni virtuali, quindi memset azzererà la memoria che non dovrebbe essere stata azzerata e la chiamata al distruttore potrebbe esplodere. Ma questo sarebbe il danneggiamento della memoria, non un buffer overflow.

Per quanto riguarda il motivo per cui il tuo strumento si lamenta: c'è un idioma comune che usa il tipo di primo argomento di memset per determinare la dimensione del buffer:

memset(&my_object, 0, sizeof(my_object));
memset(my_pointer, 0, sizeof(*my_pointer));
memset(my_array, 0, sizeof(my_array));

È possibile che il tuo strumento emetta un avviso ogni volta che usi qualcos'altro per la dimensione, perché potresti dimenticare di aggiornare sizeof quando in seguito cambi l'oggetto attuale.

    
risposta data 25.09.2014 - 15:35
fonte
1

Ignora me, sono un idiota.

Mark sottolinea che MyObject op è un'istanza di ambito locale di una classe, che verrà posizionata sullo stack. Ciò significa che &op è in realtà l'indirizzo dei dati della classe in memoria.

Come tale, non ho idea del motivo per cui questo è stato contrassegnato. Falso positivo, forse?

È giusto lamentarsi, quindi diamo un'occhiata a questo codice. Che cosa fa?

MyObject op;

Nella riga 1, definisci una variabile oggetto. Tuttavia, non si chiama il suo costruttore, quindi questa variabile oggetto non è effettivamente impostata su qualcosa - al momento è solo un puntatore non inizializzato.

memset(&op, 0, sizeof(MyObject));

Nella riga 2, prendi l'indirizzo della variabile ed esegui un memset a quell'indirizzo con una dimensione che sarà quasi certamente più grande della dimensione di un puntatore. Prestare attenzione a non non che sovrascrive la memoria che conterrà i dati dell'oggetto, ma piuttosto lo spazio di archiviazione locale dell'ambito utilizzato per contenere un puntatore all'oggetto. Questa è sicuramente una condizione di overflow.

    
risposta data 25.09.2014 - 10:55
fonte
0

Dipende dalla definizione di MyObject . Dato che è C ++, il costruttore ha impostato i valori iniziali che poi sovrascrivi usando memset . Il distruttore supporrà che tu non abbia sovrascritto l'oggetto e potrebbe esibire tutti i tipi di comportamento non intenzionale.

Ma dal momento che non mostri alcun codice, dobbiamo assumere il peggio. Gli overflow di memoria sono abbastanza possibili.

    
risposta data 25.09.2014 - 15:33
fonte

Leggi altre domande sui tag