子指令如何导致无效指针读取?

cas*_*rad 5 windows assembly x86-64 crash-dumps

我有一个崩溃转储与此代码:

mov     r11,rsp
push    rdi
sub     rsp,0A0h
mov     qword ptr [rsp+30h],0FFFFFFFFFFFFFFFEh
Run Code Online (Sandbox Code Playgroud)

这是一个功能的序幕.所以,!analyze -vINVALID_POINTER_READ与指令sub.AMD指令集表示,sub如果参数不是内存指针,则指令不会产生任何异常.

而且,READ_ADDRESSffffffffffffffff的,但在寄存器窗口,我可以看到rsp12b3e0.这是64位操作系统中的32位应用程序.

我想知道这个错误的可能原因以及如何解决它.

UPD:

方法是Microsoft Visual Studio 9.0\VC\include\xtree中的std._Tree.insert(const value_type&_Val).

编译器是来自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
Run Code Online (Sandbox Code Playgroud)

链接器来自同一来源,版本9.00.30729.01.

UPD:对于那些对使用64位调试器调试32位应用程序持怀疑态度的人,我运行了32位版本的调试器并得到了相同的结果.所以,我仍然认为这是sub指令.

UPD:澄清:该应用程序是为32位平台构建的.但处理器操作系统64位的.因此,在转储中我们可以看到具有32位值的64位寄存器,这并不奇怪.

小智 2

还有其他事情正在发生。整个操作码集中没有内存读取操作。您只有两次写入(推送和移动)。您的对齐方式很好,并且将直接 qword 值 -2 放置在应该可以的堆栈区域中。

操作系统和操作码的位数与此无关。我一直使用 64 位寄存器。就像一切都是 16 位时使用 32 位一样。

看看别的地方。