100 votes

Qu'est-ce qu'un "memory stomp" ?

Je suis juste venu à travers cet article de blog qui mentionne le "souvenir de piétinement" :

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 géré).

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

Alors, qu'est-ce que c'est, une mémoire qui piétine, une mémoire qui piétine ? Quand cela se produit-il ?

121voto

David Schwartz Points 70129

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 conflictuelle. Il existe plusieurs façons courantes de piétiner la mémoire.

L'un d'eux consiste à allouer, par exemple, 100 octets de mémoire, mais à stocker quelque chose au-delà de la 100e adresse. Cette mémoire pourrait ê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 sans rapport.

Une autre consiste à accéder à la mémoire après qu'elle ait été libérée. La mémoire peut être allouée à un autre objet. Encore une fois, le code qui révèle 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.

34voto

IronMensan Points 4161

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

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

va "piétiner" tout ce qui se trouve dans la mémoire qui suit. buffer . En général, on parle de "piétinement" lorsque la mémoire est écrite de manière non intentionnelle.

10voto

ST3 Points 3064

Les 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 mener à une boucle infinie (ou ne pas y mener), car il s'agit d'un comportement non défini.

Très probable variable i dans la mémoire est stocké juste après le tableau. Ainsi, l'accès à a[10] pourrait en fait accéder i en d'autres termes, il pourrait remettre à zéro le compteur de la boucle.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X