Ich habe einen Crash-Dump mit diesem Code:Wie ist es möglich, dass Sub-Anweisung zu ungültigen Zeiger lesen?
mov r11,rsp
push rdi
sub rsp,0A0h
mov qword ptr [rsp+30h],0FFFFFFFFFFFFFFFEh
Es ist ein Prolog einer Funktion. So sagt !analyze -v
INVALID_POINTER_READ
mit Anweisung sub
. AMD-Befehlssatz besagt, dass die sub
-Anweisung keine Ausnahmen erzeugen kann, wenn das Argument kein Speicherzeiger ist.
Auch READ_ADDRESS
ist ffffffffffffffff
, aber in den Registern Fenster kann ich sehen, dass rsp
12b3e0
ist. Und das ist 32-Bit-Anwendung in 64-Bit-Betriebssystem.
Ich möchte über eine mögliche Gründe für diesen Fehler und wie es zu beheben.
UPD:
Methode ist std._Tree.insert (const value_type & _VAL) in Microsoft Visual Studio 9.0 \ VC \ include \ xtree.
Compiler ist cl.exe von Visual Studio 2008 Installation, 32-Bit, Version 15.00.30729.01.
Befehlszeile:
/FD /EHsc /MD /GS- /Zc:wchar_t- /Yu"stdafx.h"/W3 /WX /nologo /c /Zi /TP /wd4250 /FI -Zm200 -MP -w34100 -w34189
Linkers ist aus der gleichen Quelle, Version 9.00.30729.01.
UPD: für diejenigen, die eine skeptische Ansichten zum Debuggen von 32-Bit-Anwendungen mit 64-Bit-Debuggern haben, habe ich eine 32-Bit-Version eines Debuggers ausgeführt und die gleichen Ergebnisse erhalten. Also, ich denke immer noch, dass es sub
Anweisung ist.
UPD: Um zu klären: die Anwendung für 32-Bit- Plattform. Aber die Prozessor und Betriebssystem ist 64-Bit. Es ist also nicht verwunderlich, dass wir im Dump 64-Bit-Register mit 32-Bit-Werten sehen können.
DEP? Oder falsche Informationen vom Debugger. –
Bist du sicher, dass es das "Sub" ist, das versagt? Will RIP nicht auf den Befehl nach dem Fehler zeigen ...? – cHao
David, EXCEPTION_PARAMETER1 sagt 0, also ist es nicht DEP. – cassandrad