C++ 为什么64位ubuntu中的gcc不';是否检测不到以下数组溢出?

C++ 为什么64位ubuntu中的gcc不';是否检测不到以下数组溢出?,c++,gcc,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; } #包括 #包括 int main(

所以我的代码是

#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;
}
#包括
#包括
int main()
{
const char*a=“123456789abcdef”;
charb[10];
int i=0;
而((b[i]=a[i])!='\0')
++一,;
printf(“%s,%d\n”,b,strlen(b));
返回0;
}
代码存在数组b溢出,但是当我在我的系统(64位Ubuntu12.04 lts)中使用gcc(版本4.6.3)编译它时,它成功了

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


我不知道这是我的编译器还是我的系统的问题,有人能告诉我吗?
另外,它似乎只出现在带有gcc的64位linux中。这是一个错误吗?

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


不过,有一些工具可以帮助检查内存访问是否无效。例如Valgrind在运行时执行此操作,Clang的静态分析器用于编译时检查。

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


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

使用Clang编译返回
123456789ab@,13
。我冒昧地更正了您的代码。1:main必须是int。2:a必须是const。3:printf有一个(丢失的)。顺便说一句,我得到了一个segfault。谢谢,顺便说一句,对于c,函数默认设置为int。它应该得到一个segfault,那么您使用什么编译器和系统呢!使用叮当声编译返回
123456789ab@,13
。我冒昧地更正了您的代码。1:main必须是int。2:a必须是const。3:printf有一个(丢失的)。顺便说一句,我得到了一个segfault。谢谢,顺便说一句,对于c,函数默认设置为int。它应该得到一个segfault,那么您使用什么编译器和系统呢!首先,谢谢大家!我知道防止缓冲区溢出是程序员的责任,我只是好奇这是否是一个bug。我让我的朋友在他的64位系统中运行这个,结果是一样的,当在32位系统中运行时,它不会成功,那么,我们可以说这是由gcc和64位linux的兼容性引起的吗?@cocoowan这是您代码中的一个bug:-)当您写入不应该写入的内存时,会出现未定义的行为。未定义的行为意味着任何事情都可能发生。程序可能会崩溃,也可能不会。这就是“未定义”的意思。首先,谢谢!我知道防止缓冲区溢出是程序员的责任,我只是好奇这是否是一个bug。我让我的朋友在他的64位系统中运行这个,结果是一样的,当在32位系统中运行时,它不会成功,那么,我们可以说这是由gcc和64位linux的兼容性引起的吗?@cocoowan这是您代码中的一个bug:-)当您写入不应该写入的内存时,会出现未定义的行为。未定义的行为意味着任何事情都可能发生。程序可能会崩溃,也可能不会。这就是“未定义”的意思。