Що таке "тупання пам'яті"?


95

Я щойно натрапив на цю публікацію в блозі, де згадується «тупання пам’яті»:

програма C ++, яка легко здатна заглушити пам'ять (те, про що ви, мабуть, ніколи не чули, якщо ви народилися в світі керованого коду.)

А насправді я ніколи про це не чув!

Отже, що це, пам’ять тупотить, тупає пам’ять? Коли це відбувається?


4
Хороший приклад удару пам’яті - це запитання: stackoverflow.com/questions/31016660/…
Phillip Ngan,

Відповіді:


117

Пам'ять "затухається", коли фрагмент коду маніпулює пам'яттю, не розуміючи, що інший фрагмент коду використовує цю пам'ять таким чином, що конфліктує. Існує кілька загальних способів, якими можна заглушити пам'ять.

Один виділяє, скажімо, 100 байт пам’яті, але потім зберігає щось минуле 100-ї адреси. Ця пам'ять може використовуватися для зберігання чогось зовсім іншого. Це особливо важко налагодити, оскільки проблема з’явиться, коли щось намагається отримати доступ до потерпілої, на яку потрапили, і код, який наткнувся на неї, може бути абсолютно не пов'язаним.

Інша - доступ до пам'яті після її звільнення. Пам'ять може бути виділена для іншого об'єкта. Знову ж таки, код, який показує проблему, може бути пов’язаний з нещодавно виділеним об’єктом, який отримав ту саму адресу і не пов'язаний з кодом, який спричинив проблему.


3
Ось приємний приклад тупання пам’яті.
patryk.beza

33

Дуже часто це буферне перевищення; як приклад, цей код:

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

буде "тупати" по тому, що трапиться, що залишиться в наступній справі після buffer. Взагалі кажучи, «тупання» - це коли пам'ять записана ненавмисно.


9

Інші відповіді в основному правильні, але я хотів би навести приклад.

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;

Ці зразки можуть призвести до нескінченного циклу (або можуть не призвести), оскільки це не визначена поведінка.

Дуже ймовірна змінна iпам'ять зберігається відразу після масиву. Таким чином, доступ a[10]може насправді отримати доступ, iіншими словами, він може скинути лічильник циклу.

Я думаю, що це гарний приклад, який демонструє пам’ять «тупання».


1
Є нитка антера, яка майже обговорює той самий приклад в різних операційних системах ... stackoverflow.com/questions/31016660
Christian

2
@Christian Це не має нічого спільного з ОС. Це невизначена поведінка.
ST3
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.