How to debug a buffer overrun

今天在vs上调试c++代码,遇到一个bug,程序直接跳出错误“A buffer overrun has occurred ”花了一会时间改这个bug,现在把这个过程记录下来。

一般如果是栈出这种错误这种情况很可能发生在某个函数调用结束返回的时候出的问题,说明栈调用里面存在越界的情况,然后就开始检查我的代码,我发现我也没有新定义string,或者使用什么memcpy,strcpy的函数,然后求助于google,发现了msdn对于这个问题有一个不错的解释,原链接,英文的:Avoiding Buffer Overruns

下面将我自己的理解下下来以及我今天犯得错误,以避免以后再出现类似问题:
一般来说,buffer overrun 这种错误很多都是由于源代码不安全导致的,通常都是因为没有检查数据的输入,导致内存中出现不可预知的数据从而导致错误发生,一般都会存在内存拷贝操作,比如strcat,strcpy,wscpy等这些操作。下面是经常导致发生这个错误的一些原因:

1.static buffer overruns:
通常都是因为向一块固定内存数组写入了大于数组容量的数据,比如下面的代码:

char  array[10];
for(int i =0; i < 20; i++){
array[i] = 'x';
} 

这样一段代码就容易导致这一问题的发生。我今天的代码就是出现了类似的情况,不过我使用了格式化内存的sprintf函数,代码大致如下:


char name[10];
sprintf(name,"this is a length over %d test",10);

由于这段内存在程序运行过程中没有被其他代码用到,所以程序运行过程中是正确的,但是在函数结束清空栈的时候却报错了。
2.array indexing errors
数组越界也会出现这样的问题,访问数组的时候一定要检查边界问题。

猜你喜欢

转载自blog.csdn.net/zidaoziyande/article/details/79628856
今日推荐