O que é um “pisar na memória”?

95

Acabei de encontrar uma postagem de blog que menciona “memória marcante”:

um programa C ++ que é facilmente capaz de controlar a memória (algo do qual você provavelmente nunca ouviu falar se nasceu em um mundo de código gerenciado).

E na verdade nunca ouvi falar disso!

Então, o que é isso, um piscar de memória, uma memória de piscar? Quando isso ocorre?

scravy
fonte
4
Um bom exemplo de um pisoteio de memória é esta pergunta: stackoverflow.com/questions/31016660/…
Phillip Ngan

Respostas:

117

A memória é "pisoteada" quando um trecho de código manipula a memória sem perceber que outro trecho de código está usando essa memória de forma conflitante. Existem várias maneiras comuns de pisar na memória.

Um está alocando, digamos, 100 bytes de memória, mas armazenando algo além do 100º endereço. Essa memória pode ser usada para armazenar algo completamente diferente. Isso é particularmente difícil de depurar porque o problema aparecerá quando algo tentar acessar a vítima que foi pisoteada, e o código que pisou nele pode ser totalmente não relacionado.

Outra é acessar a memória depois que ela foi liberada. A memória pode ser alocada para outro objeto. Novamente, o código que mostra o problema pode estar relacionado ao objeto recém-alocado que obteve o mesmo endereço e não relacionado ao código que causou o problema.

David Schwartz
fonte
3
Aqui está um bom exemplo de pisoteamento de memória.
patryk.beza
33

Muitas vezes, é uma saturação de buffer; como exemplo, este código:

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

irá "pisar" em qualquer coisa que aconteça na próxima coisa na memória depois buffer. De um modo geral, 'pisotear' é quando a memória é gravada involuntariamente.

IronMensan
fonte
9

Outras respostas estão basicamente corretas, mas gostaria de dar um exemplo.

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;

Essas amostras podem levar a um loop infinito (ou não), porque é um comportamento indefinido.

Muito provavelmente a variável ina memória é armazenada logo após a matriz. Portanto, o acesso a[10]poderia realmente acessar, iem outras palavras, ele poderia redefinir o contador de loop.

Acho que é um bom exemplo que demonstra "piscar" da memória.

ST3
fonte
1
Há um outro tópico, discutindo praticamente o mesmo exemplo em sistema operacional diferente ... stackoverflow.com/questions/31016660
Christian
2
@Christian Não tem nada a ver com um sistema operacional. Este é um comportamento indefinido.
ST3 de