下面的代码有一个明显的错误,它超出data2
,但它不会触发运行时错误,例如崩溃。
#include <stdio.h>
#include <memory.h>
unsigned char data1[4];
unsigned char data2[4];
int main()
{
memset(data1, 1, 4);
memset(data2, 2, 4);
int i;
for(i=0;i<4;i++)
printf("%d %d\n", data1[i], data2[i]);
data2[4] = 2;//wrong
printf("===============================\n");
for(i=0;i<4;i++)
printf("%d %d\n", data1[i], data2[i]);
return 1;
}
输出:
1 2
1 2
1 2
1 2
===============================
2 2 // this is a error, data1 had been changed, but not showing runtime error.
1 2
1 2
1 2
Press any key to continue
如何检测此类错误?是否有任何选项可以使内存错误在gcc或visual studio中生成警告或运行时错误?
答案 0 :(得分:2)
我会用 valgrind 执行你之前提到的庞大程序,以获得程序中可能出错的详细报告。
答案 1 :(得分:1)
您的数组有4个元素,因此有效索引为0..3。写入data2[4]
超出了周围记忆的范围,恰好被data1
占用。经典缓冲区溢出bug。代码有未定义的行为,任何事情都可能发生。