Что такое «топор памяти»?

96

Я только что наткнулся на это сообщение в блоге, в котором упоминается «топание памяти»:

программа на C ++, которая легко может топтать память (о чем вы, вероятно, даже не слышали, если родились в мире управляемого кода).

И вообще никогда не слышал об этом!

Итак, что это, топчание памяти, топчание памяти? Когда это происходит?

царапина
источник
4
Хороший пример «вытеснения памяти» - это вопрос: stackoverflow.com/questions/31016660/…
Филипп Нган

Ответы:

118

Память «топтается», когда часть кода манипулирует памятью, не осознавая, что другой фрагмент кода использует эту память конфликтным образом. Есть несколько распространенных способов потрепать память.

Один из них выделяет, скажем, 100 байт памяти, но затем сохраняет что-то после 100-го адреса. Эта память может использоваться для хранения чего-то совершенно другого. Это особенно сложно отладить, потому что проблема возникнет, когда что-то попытается получить доступ к жертве, на которую наступили, и код, который наступил на нее, может быть совершенно не связанным.

Другой - доступ к памяти после ее освобождения. Память может быть выделена для другого объекта. Опять же, код, который показывает проблему, может быть связан с вновь выделенным объектом, который получил тот же адрес и не связан с кодом, вызвавшим проблему.

Дэвид Шварц
источник
3
Вот хороший пример того, как топают память.
patryk.beza
34

Очень часто это переполнение буфера; например, этот код:

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другими словами, он может сбросить счетчик цикла.

Думаю, это хороший пример, демонстрирующий "топание" памяти.

ST3
источник
1
Есть еще одна ветка, в которой обсуждается практически тот же пример в другой операционной системе ... stackoverflow.com/questions/31016660
Christian
2
@Christian Это не имеет ничего общего с ОС. Это неопределенное поведение.
ST3