为什么 64 位 ubuntu 中的 gcc 没有检测到以下数组溢出?
Why gcc in 64 bit ubuntu doesn't detect the following array overflow?
我的代码是
#include <stdio.h>
#include <string.h>
int main()
{
const char *a="123456789abcdef";
char b[10];
int i=0;
while((b[i]=a[i])!=' ')
++i;
printf("%s, %dn",b,strlen(b));
return 0;
}
代码存在数组b的数组溢出,但是当我在我的系统(64位ubuntu 12.04 lts)中使用gcc(版本4.6.3)编译它时,它成功了。
程序输出为123456789abcdef, 15
返回0表示程序正常退出。
我不知道这是我的编译器的问题还是我的系统的问题,有没有人可以告诉我?附注:它似乎只出现在64位linux与gcc。这是臭虫吗?
在c语言中不检查数组访问。如果像这样溢出缓冲区,结果是未定义的行为。这是程序员的责任,而不是编译器的责任。
有一些工具可以帮助检查无效的内存访问。像Valgrind在运行时这样做,Clang的静态分析器在编译时检查。
相关文章:
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- C++ 对象数组堆栈溢出
- 将字符数组转换为结构时出现问题. 结构的字符数组变量溢出
- 在C++中使用数组时如何防止堆栈溢出?
- 缓冲区溢出 - 数组索引越界(严重)
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- 初始化数组并出现堆栈溢出错误
- 静态数组溢出堆栈(seg 错误 11)仅在类定义内部时,否则不会..?
- 我在 36603 以上输入的任何数组大小时都会返回"堆栈溢出"错误。如何使字符串能够捕获整个.txt文件?
- 标准::数组类上的堆栈溢出
- C++ 3D 数组到 1D 会导致堆缓冲区溢出
- 为什么我的程序一直给我堆缓冲区溢出,即使我没有超出数组的界限或覆盖任何值
- C++堆栈溢出初始化数组
- std::堆栈和堆栈溢出错误的数组分配
- 二叉搜索数组溢出 C++
- ReferenceTable溢出(jni-android),数组对象释放
- 将字符数组传递给使用构造函数初始化的类构造函数时防止溢出
- 为什么 64 位 ubuntu 中的 gcc 没有检测到以下数组溢出?
- 数组溢出c++ (at arr[0])