为什么64位ubuntu中的gcc没有检测到以下数组溢出?

时间:2013-01-19 08:54:44

标签: c++ gcc

所以我的代码是

#include <stdio.h>
#include <string.h>
int main()
{
    const char *a="123456789abcdef";
    char b[10];
    int i=0;
    while((b[i]=a[i])!='\0')
        ++i;
    printf("%s, %d\n",b,strlen(b));
    return 0;
}

代码存在一个带有数组b的数组溢出,但是当我在我的系统(64位ubuntu 12.04 lts)中用gcc(版本4.6.3)编译它时,它成功了。

该程序的输出为 123456789abcdef,15 ,并且返回0表示该程序正常退出。

我不知道无论是我的编译器问题还是我的系统,是否有人可以告诉我? 附:看起来它只出现在带有gcc的64位linux中。这是一个错误吗?

1 个答案:

答案 0 :(得分:7)

在C中不检查数组访问。如果溢出这样的缓冲区,结果是未定义的行为。程序员有责任防范这一点,而不是编译器。

虽然有一些工具可以帮助检查无效的内存访问。就像Valgrind在运行时这样做,以及Clang的静态分析器用于编译时检查。