1

正在阅读一些文本并尝试在 C 中写入超过数组的大小,即缓冲区溢出。文本表明,每当您尝试写出array[5]数组长度为 5 时,就会出现分段错误,但使用下面的代码时我似乎没有得到。代码实际运行。

#include <stdio.h>
#include <string.h>

int main ()
{
    int i;
    int array[5] = {1, 2, 3, 4, 5};
    for (i = 0; i <= 255; i++)
    {
        array[i] = 10;
    }
    int len = sizeof(array) / sizeof(int);
    printf("%d\n", len);
    printf("%d\n", array[254]);
}

在执行最后一条语句时,将10打印 a。我想知道这是否是一个漏洞,或者我是否缺少某些东西。我在 macbook pro 上运行 iterm2 的代码。

4

3 回答 3

4

写到最后是未定义的行为——任何事情都可能发生。

于 2012-06-15T21:10:31.120 回答
1

您正在将数据写入数组末尾。这是未定义的行为。未定义的行为意味着它可能在星期五工作,但在星期六崩溃。

这是 C 段落,它说它是未定义的行为:

(C99, 6.5.3.2p4) 如果给指针分配了无效值,则一元 * 运算符的行为未定义。

于 2012-06-16T01:16:30.073 回答
0

您将能够检查当前进程拥有的任何内存。当您到达该内存块的末尾时,您将收到 EXC_BAD_ACCESS 错误。试试这个循环的代码的修改版本,直到操作系统杀死它:

#include <stdio.h>
#include <string.h>

int main(int argc, const char * argv[])
{
    int i = 0;
    int array[5] = {1, 2, 3, 4, 5};
    while (1)
    {
        printf("%llu - %d\n", i, array[i]);
            // if (&i == &array[i]) printf("Overwriting i\n");
            // array[i] = 2;
        ++i;
    }
}

如果您取消注释已注释掉的行,您应该会发现您陷入了 i 值 3 和 6 之间的无限循环。您正在覆盖位于i整数地址的内存。

于 2012-06-15T21:33:24.817 回答