c ++内存损坏检测

时间:2017-08-05 06:17:10

标签: c++ memory-management

下面的代码有一个明显的错误,它超出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中生成警告或运行时错误?

2 个答案:

答案 0 :(得分:2)

我会用 valgrind 执行你之前提到的庞大程序,以获得程序中可能出错的详细报告。

答案 1 :(得分:1)

您的数组有4个元素,因此有效索引为0..3。写入data2[4]超出了周围记忆的范围,恰好被data1占用。经典缓冲区溢出bug。代码有未定义的行为,任何事情都可能发生。