通过强制转换访问无效内存?

时间:2015-01-14 12:00:55

标签: c

采取这个人为的例子:

#include <stdlib.h>
#include <string.h>

int main (int argc, char const *argv[])
{
    char *buf = malloc(8);
    strcpy(buf,"Hello W");

    char *last = &buf[4];

    size_t u = *(size_t *)(last);

    printf("0x%lx",u); // prints "0x57206f" on little endian

    return 0;
}

根据我对C的内存管理的(非常基本的)理解,这将导致以下内存读取(假设为64位):

+--+--+--+--+--+--+--+--+--+--+--+--+--+
|H |e |l |l |o |  |W |\0|? |? |? |? |… |
+--+--+--+--+--+--+--+--+--+--+--+--+--+
             ^^^^^^^^^^^^^^^^^^^^^^^

从而访问可能尚未分配给程序并导致崩溃的内存区域。 然而,这似乎在实践中运作良好 - 这是定义的行为吗?

增加:

我从此处显示的代码中创建了此示例:http://www.daemonology.net/blog/2008-06-05-faster-utf8-strlen.html

1 个答案:

答案 0 :(得分:2)

你的理解正在停止。

您会得到未定义的行为。当发生这种情况时,确切的可见结果当然是未定义的。你不能声称“它有效,因为它没有崩溃”。不会崩溃肯定会发生一件事,但崩溃也是如此。毕竟,这种行为是未定义的。