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?
c++
c
memory
memory-management
scravy
la source
la source
Réponses:
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.
la source
Très souvent, il s'agit d'un dépassement de tampon; à titre d'exemple, ce code:
"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.la source
D'autres réponses sont fondamentalement correctes, mais je voudrais donner un exemple.
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
i
en mémoire est stockée juste après le tableau. Ainsi, l'accèsa[10]
pourrait effectivement accéder,i
en 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.
la source