溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

VS 0xC0000005 運行錯誤分析

發(fā)布時間:2020-06-24 03:34:25 來源:網(wǎng)絡(luò) 閱讀:7815 作者:fengyuzaitu 欄目:編程語言

0xC0000005: 讀取位置 0x22203A22 時發(fā)生訪問沖突

場景

   網(wǎng)絡(luò)傳輸過來的,由于采用了qpid-cpp庫,獲取到的是request.getContent()的是string類型的數(shù)據(jù)類型,然后通過c_str函數(shù),獲取到字符串,保存在一個char szBuffer[1024]數(shù)組內(nèi),在定義的類,調(diào)用析構(gòu)函數(shù)退出導(dǎo)致程序崩潰


原因

    通過strcpy拷貝字符串到szBuffer數(shù)組,發(fā)生了數(shù)組的越界,因為字符串的長度是1159


提醒

    目前已經(jīng)出現(xiàn)過兩次的0xC0000005崩潰信息

1 訪問一個釋放的空指針,在一個遞歸的邏輯中

2 strcpy拷貝字符串,發(fā)生數(shù)組越界


xC0000005:讀取位置oxfeeefeee時發(fā)生訪問沖突

問題

    test.exe 中的 0x1021af50 (zlib.dll) 處未處理的異常: 0xC0000005: 讀取位置 0xfeeefeee 時發(fā)生訪問沖突

    

分析

    代碼中斷于獲取list的迭代指針:

 #if _HAS_ITERATOR_DEBUGGING || _SECURE_SCL

iterator begin()

{// return iterator for beginning of mutable sequence

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

}

懷疑1:是否是堆棧溢出?不可能沒有占用多少空間

懷疑2:是否迭代書寫問題?不可能在其他的程序運行良好

現(xiàn)象:調(diào)用堆棧的顯示區(qū)域,提示:feeefeee()

進行debug設(shè)置:調(diào)試菜單下,勾選所有的異常,在調(diào)試的模式下,重新編譯。這一次指向list迭代之前的一行代碼,這行代碼進行了字符串的拷貝,觀察賦值指針,pszName的值是0xfeeefeee:錯誤的指針。


補充知識

FEEEFEEE微軟的HeapFree函數(shù)用該值來標記被釋放了的堆內(nèi)存


經(jīng)過上面的知識,可以知道任何的一塊內(nèi)存分配,都會在字符串中填充0xfeeefeee作為內(nèi)存沒有釋放的標志,當調(diào)用函數(shù)釋放內(nèi)存的時候,就會首先檢查指針的內(nèi)容是否包含該標志位,如果沒有該標志位,就會出現(xiàn)異常中斷的情況。pszName分配的內(nèi)存已經(jīng)被釋放,導(dǎo)致了程序中斷。在項目中,采用了遞歸的算法進行了多次的搜索,在函數(shù)進行退出遞歸的時候,該指針已經(jīng)指向了一個已經(jīng)釋放的內(nèi)存,所在在進行遞歸的過程中,將已有的內(nèi)容拷貝出來,防止在遞歸的過程中被釋放,從而解決了問題。




向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI