我有一個崩潰轉儲與此代碼:子指令有可能導致無效指針讀取?
mov r11,rsp
push rdi
sub rsp,0A0h
mov qword ptr [rsp+30h],0FFFFFFFFFFFFFFFEh
這是一個函數的序幕。因此,!analyze -v
指示INVALID_POINTER_READ
指令sub
。 AMD指令集說如果參數不是內存指針,則sub
指令不能產生任何異常。
另外,READ_ADDRESS
是ffffffffffffffff
,但在寄存器窗口中,我可以看到rsp
是12b3e0
。這是64位操作系統中的32位應用程序。
我想知道這個錯誤的可能原因以及如何解決它。
UPD:
方法是std._Tree.insert(常量VALUE_TYPE & _Val)在Microsoft Visual Studio 9.0 \ VC \包括\的XTree。
編譯器是Visual Studio 2008安裝中的cl.exe,32位版本15.00.30729.01。
命令行:
/FD /EHsc /MD /GS- /Zc:wchar_t- /Yu"stdafx.h"/W3 /WX /nologo /c /Zi /TP /wd4250 /FI -Zm200 -MP -w34100 -w34189
接頭來自同一來源,版本9.00.30729.01。
UPD:對於那些對使用64位調試器調試32位應用程序持懷疑態度的人,我已經運行了32位版本的調試器並獲得了相同的結果。所以,我仍然認爲這是sub
指令。
UPD:澄清:應用程序是爲32位平臺構建的。但是處理器和操作系統是64位。所以,在轉儲中我們可以看到帶有32位值的64位寄存器,這並不奇怪。
DEP?或來自調試器的虛假信息。 –
你確定它是失敗的'sub'? RIP不喜歡在失敗後的指令中指出......? – cHao
David,EXCEPTION_PARAMETER1說0,所以它不是DEP。 – cassandrad