Qu'est-ce qu'une «mémoire stomp»?

95

Je viens de tomber sur ce billet de blog qui mentionne «la mémoire stomping»:

un programme C ++ qui est facilement capable de piétiner la mémoire (quelque chose dont vous n'avez probablement jamais entendu parler si vous êtes né dans un monde de code managé.)

Et en fait je n'en ai jamais entendu parler!

Alors, qu'est-ce que c'est, un piétinement de la mémoire, un piétinement de la mémoire? Quand cela se produit-il?

scravy
la source
4
Un bon exemple de mémoire stomp est cette question: stackoverflow.com/questions/31016660/…
Phillip Ngan

Réponses:

117

La mémoire est «piétinée» lorsqu'un morceau de code manipule la mémoire sans se rendre compte qu'un autre morceau de code utilise cette mémoire d'une manière qui est en conflit. Il existe plusieurs façons courantes de piétiner la mémoire.

L'un alloue, disons, 100 octets de mémoire, mais stocke ensuite quelque chose au-delà de la 100e adresse. Cette mémoire peut être utilisée pour contenir quelque chose de complètement différent. Ceci est particulièrement difficile à déboguer car le problème apparaîtra lorsque quelque chose essaiera d'accéder à la victime qui a été piétinée, et le code qui l'a piétiné peut être totalement indépendant.

Un autre accède à la mémoire après sa libération. La mémoire peut être allouée pour un autre objet. Là encore, le code qui montre le problème peut être lié à l'objet nouvellement alloué qui a obtenu la même adresse et sans rapport avec le code qui a causé le problème.

David Schwartz
la source
3
Voici un bel exemple de piétinement de la mémoire.
patryk.beza
33

Très souvent, il s'agit d'un dépassement de tampon; à titre d'exemple, ce code:

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

"piétinera" tout ce qui se passe dans la prochaine chose en mémoire après buffer. De manière générale, le «piétinement» est lorsque la mémoire est écrite involontairement.

IronMensan
la source
9

D'autres réponses sont fondamentalement correctes, mais je voudrais donner un exemple.

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;

Ces échantillons peuvent conduire à une boucle infinie (ou peuvent ne pas conduire), car il s'agit d'un comportement indéfini.

Très probablement, la variable ien mémoire est stockée juste après le tableau. Ainsi, l'accès a[10]pourrait effectivement accéder, ien d'autres termes, il pourrait réinitialiser le compteur de boucle.

Je pense que c'est un bon exemple qui démontre le «piétinement» de la mémoire.

ST3
la source
1
Il y a un autre fil, discutant à peu près du même exemple sur différents systèmes d'exploitation ... stackoverflow.com/questions/31016660
Christian
2
@Christian Cela n'a rien à voir avec un OS. Il s'agit d'un comportement indéfini.
ST3