2013-12-20 46 views
5

我有一個崩潰轉儲與此代碼:子指令有可能導致無效指針讀取?

mov  r11,rsp 
push rdi 
sub  rsp,0A0h 
mov  qword ptr [rsp+30h],0FFFFFFFFFFFFFFFEh 

這是一個函數的序幕。因此,!analyze -v指示INVALID_POINTER_READ指令sub。 AMD指令集說如果參數不是內存指針,則sub指令不能產生任何異常。

另外,READ_ADDRESSffffffffffffffff,但在寄存器窗口中,我可以看到rsp12b3e0。這是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位寄存器,這並不奇怪。

+1

DEP?或來自調試器的虛假信息。 –

+2

你確定它是失敗的'sub'? RIP不喜歡在失敗後的指令中指出......? – cHao

+0

David,EXCEPTION_PARAMETER1說0,所以它不是DEP。 – cassandrad

回答

2

其他事情正在進行。在整組操作碼中沒有存儲器讀取操作。你只有兩個寫入(push和mov)。你的對齊是好的,並且將立即qword值-2在堆棧的一個應該可以的區域中完成。

操作系統和操作碼的不好與此有關。我一直使用64位寄存器。這就像使用32位,當一切都是16位。

找別的地方。