VS 0xC0000005 运行错误分析

您所在的位置:网站首页 vs运行有未经处理的异常 VS 0xC0000005 运行错误分析

VS 0xC0000005 运行错误分析

2024-07-07 16:26| 来源: 网络整理| 查看: 265

0xC0000005: 读取位置 0x22203A22 时发生访问冲突

场景

   网络传输过来的,由于采用了qpid-cpp库,获取到的是request.getContent()的是string类型的数据类型,然后通过c_str函数,获取到字符串,保存在一个char szBuffer[1024]数组内,在定义的类,调用析构函数退出导致程序崩溃

原因

    通过strcpy拷贝字符串到szBuffer数组,发生了数组的越界,因为字符串的长度是1159

提醒

    目前已经出现过两次的0xC0000005崩溃信息

1 访问一个释放的空指针,在一个递归的逻辑中

2 strcpy拷贝字符串,发生数组越界

xC0000005:读取位置oxfeeefeee时发生访问冲突

问题

    test.exe 中的 0x1021af50 (zlib.dll) 处未处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突

    

分析

    代码中断于获取list的迭代指针:

 #if _HAS_ITERATOR_DEBUGGING || _SECURE_SCL

iterator begin()

{// return iterator for beginning of mutable sequence

return (iterator(_Nextnode(_Myhead), this));

}

怀疑1:是否是堆栈溢出?不可能没有占用多少空间

怀疑2:是否迭代书写问题?不可能在其他的程序运行良好

现象:调用堆栈的显示区域,提示:feeefeee()

进行debug设置:调试菜单下,勾选所有的异常,在调试的模式下,重新编译。这一次指向list迭代之前的一行代码,这行代码进行了字符串的拷贝,观察赋值指针,pszName的值是0xfeeefeee:错误的指针。

补充知识

FEEEFEEE微软的HeapFree函数用该值来标记被释放了的堆内存

经过上面的知识,可以知道任何的一块内存分配,都会在字符串中填充0xfeeefeee作为内存没有释放的标志,当调用函数释放内存的时候,就会首先检查指针的内容是否包含该标志位,如果没有该标志位,就会出现异常中断的情况。pszName分配的内存已经被释放,导致了程序中断。在项目中,采用了递归的算法进行了多次的搜索,在函数进行退出递归的时候,该指针已经指向了一个已经释放的内存,所在在进行递归的过程中,将已有的内容拷贝出来,防止在递归的过程中被释放,从而解决了问题。

     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1959204,如需转载请自行联系原作者



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3