什么是“记忆跺脚”

What is a “memory stomp”?

本文关键字:记忆跺脚 记忆 什么      更新时间:2023-10-16

我刚刚看到这篇提到"踩踏记忆"的博客文章:

一个C++程序,很容易踩踏内存 (如果你是,你可能从未听说过 诞生于托管代码世界。

事实上,我从未听说过它!

那么,这是什么,记忆跺脚,跺脚记忆?什么时候发生?

当一段代码操纵内存而没有意识到另一段代码正在以冲突的方式使用该内存时,内存就会被"踩踏"。有几种常见的方法可以踩踏记忆。

一种是分配,比如说,100字节的内存,然后存储超过第100个地址的东西。这种记忆可能被用来保存完全不同的东西。这特别难以调试,因为当某些东西试图访问被踩踏的受害者时,就会出现问题,而踩在上面的代码可能完全无关。

另一个是在释放内存后访问内存。可以为另一个对象分配内存。同样,显示问题的代码可能与新分配的对象相关,该对象具有相同的地址,而与导致问题的代码无关。

通常它是缓冲区溢出;例如,以下代码:

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

将"踩踏"buffer之后内存中下一件事中碰巧发生的任何事情.一般来说,"跺脚"是指无意中写入内存。

其他答案基本上是正确的,但我想举一个例子。

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换句话说,它可以重置循环计数器。

我认为这是演示记忆"跺脚"的好例子。