c++ Cos'è una "memoria stomp"?




memory memory-management (3)

Ho appena trovato questo post sul blog che menziona "memoria stomping":

un programma C ++ che è facilmente in grado di stompare la memoria (qualcosa che probabilmente non hai nemmeno mai sentito nominare se sei nato in un mondo di codice gestito).

E infatti non ne ho mai sentito parlare!

Quindi, cos'è, una memoria calpesta, calpesta la memoria? Quando si verifica?


Molto spesso è un sovraccarico del buffer; ad esempio, questo codice:

char buffer[8];
buffer[8] = 'a';

"calpesterà" qualsiasi cosa accada nella prossima cosa in memoria dopo il buffer . In generale, "stomping" è quando la memoria viene scritta involontariamente.


La memoria viene "calpestata" quando un pezzo di codice manipola la memoria senza rendersi conto che un altro pezzo di codice sta usando quella memoria in un modo che confligge. Ci sono molti modi in cui la memoria può essere calpestata.

Uno sta allocando, diciamo, 100 byte di memoria, ma poi memorizza qualcosa oltre il 100 ° indirizzo. Questa memoria potrebbe essere usata per contenere qualcosa di completamente diverso. Questo è particolarmente difficile da eseguire il debug perché il problema verrà visualizzato quando qualcosa tenta di accedere alla vittima che è stata calpestata e il codice che lo ha calpestato potrebbe non essere completamente correlato.

Un altro sta accedendo alla memoria dopo che è stato liberato. La memoria può essere allocata per un altro oggetto. Anche in questo caso, il codice che mostra il problema potrebbe essere correlato all'oggetto appena assegnato che ha ottenuto lo stesso indirizzo e non correlato al codice che ha causato il problema.


Altre risposte sono fondamentalmente corrette, ma vorrei fare un esempio.

int a[10], i;       
for (i = 0; i < 11 ; i++)
    a[i] = 0;
int i, a[10];     
for (i = 0; i < 11 ; i++)
    a[i] = 0;

Questi campioni possono portare a loop infiniti (o non condurre), perché è un comportamento indefinito.

La variabile molto probabile in memoria viene memorizzata subito dopo la matrice. Quindi accedere a[10] potrebbe effettivamente accedere a in altre parole potrebbe ripristinare il contatore di loop.

Penso che sia un buon esempio che dimostra la memoria "stomping".





memory-management