温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

VS 0xC0000005 运行错误分析

发布时间:2020-06-24 03:34:25 来源:网络 阅读:7799 作者:fengyuzaitu 栏目:编程语言

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分配的内存已经被释放,导致了程序中断。在项目中,采用了递归的算法进行了多次的搜索,在函数进行退出递归的时候,该指针已经指向了一个已经释放的内存,所在在进行递归的过程中,将已有的内容拷贝出来,防止在递归的过程中被释放,从而解决了问题。




向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI