什么是“内存踩踏”?

100

我刚看到这篇博客文章,提到了“stomping memory”:

C++程序可以轻松地踩踏内存(如果你生活在托管代码的世界里,你可能从未听说过这个术语)。

实际上我从未听说过这个!

那么,什么是内存踩踏?它是什么时候发生的?


6
一个内存踩踏的好例子是这个问题:https://dev59.com/jF0Z5IYBdhLWcg3w0zJW - Phillip Ngan
3个回答

122

内存遭到“践踏”是指某段代码在操作内存时没有意识到另一段代码也在以冲突的方式使用该内存。有几种常见的内存遭到践踏的情况。

其中一种情况是分配了 100 字节的内存,但却将某些东西存储在第 100 个地址之后。这段内存可能被用于完全不同的用途。这种情况特别难以调试,因为问题会在尝试访问被践踏的受害者时出现,而造成问题的代码可能与其毫无关联。

另一种情况是在释放内存后访问该内存。该内存可能已为另一个对象分配。同样,造成问题的代码可能与获得相同地址的新分配对象相关,而与造成问题的代码无关。


3
这是一个很好的内存破坏示例。 - patryk.beza

34

很常见的问题是缓冲区溢出;举个例子,就拿这段代码来说:

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

会“践踏”在buffer后面的内存中的任何东西。一般来说,“践踏”是指无意间写入内存。


10

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

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
有另一个线程,在不同的操作系统上讨论几乎相同的例子... https://dev59.com/jF0Z5IYBdhLWcg3w0zJW - Christian
2
@Christian 这与操作系统无关。这是一种未定义的行为。 - ST3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接