Co to jest „tupot pamięci”?

96

Właśnie natknąłem się na ten wpis na blogu, który wspomina o „tupaniu pamięci”:

program w C ++, który jest w stanie z łatwością tupać pamięć (coś, o czym prawdopodobnie nigdy nie słyszałeś, jeśli urodziłeś się w świecie kodu zarządzanego).

Właściwie nigdy o tym nie słyszałem!

Więc co to jest, tupot pamięci, tupot wspomnienie? Kiedy to się dzieje?

straszny
źródło
4
Dobrym przykładem uderzenia pamięci jest to pytanie: stackoverflow.com/questions/31016660/ ...
Phillip Ngan

Odpowiedzi:

118

Pamięć jest „nadeptywana”, gdy fragment kodu manipuluje pamięcią, nie zdając sobie sprawy, że inny fragment kodu używa tej pamięci w sposób powodujący konflikt. Istnieje kilka typowych sposobów nadepnięcia na pamięć.

Jeden z nich przydziela, powiedzmy, 100 bajtów pamięci, ale potem zapisuje coś poza setnym adresem. Ta pamięć może służyć do przechowywania czegoś zupełnie innego. Jest to szczególnie trudne do debugowania, ponieważ problem pojawi się, gdy coś spróbuje uzyskać dostęp do nadepniętej ofiary, a kod, który nadepnął, może być całkowicie niezwiązany.

Innym jest dostęp do pamięci po jej zwolnieniu. Pamięć może być przydzielona dla innego obiektu. Ponownie, kod, który pokazuje problem, może być powiązany z nowo przydzielonym obiektem, który otrzymał ten sam adres i niezwiązany z kodem, który spowodował problem.

David Schwartz
źródło
3
Oto ładny przykład tupania pamięci.
patryk.beza 22.07.15
34

Bardzo często jest to przepełnienie bufora; jako przykład ten kod:

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

będzie „tupać” na czymkolwiek, co stanie się później w pamięci buffer. Ogólnie mówiąc, „tupanie” ma miejsce, gdy pamięć jest zapisywana nieumyślnie.

IronMensan
źródło
9

Inne odpowiedzi są w zasadzie poprawne, ale chciałbym podać przykład.

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;

Te próbki mogą prowadzić do nieskończonej pętli (lub mogą nie prowadzić), ponieważ jest to niezdefiniowane zachowanie.

Bardzo prawdopodobne, że zmienna iw pamięci jest przechowywana zaraz po tablicy. Zatem dostęp a[10]może faktycznie uzyskać dostęp, iinnymi słowy, może zresetować licznik pętli.

Myślę, że jest to dobry przykład pokazujący „tupanie” pamięci.

ST3
źródło
1
Jest inny wątek omawiający prawie ten sam przykład w innym systemie operacyjnym ... stackoverflow.com/questions/31016660
Christian
2
@Christian To nie ma nic wspólnego z systemem operacyjnym. To jest niezdefiniowane zachowanie.
ST3