这个缓冲区是否在Mac OSX上运行?

时间:2012-06-15 21:04:22

标签: c security

正在读取一些文本并试图在C中写入超过数组的大小,即缓冲区溢出。文本表明,当数组的长度为5时,当你试图写array[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。我想知道这是一个漏洞还是我遗漏了什么。我在macbook pro上运行iterm2的代码。

3 个答案:

答案 0 :(得分:4)

写完结束是未定义的行为 - 任何事情都可能发生。

答案 1 :(得分:1)

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

这是C段,表示它是未定义的行为:

  

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

答案 2 :(得分: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;
    }
}

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