2013-12-20 1 views
5

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 -vINVALID_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 rsp12b3e0 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.

+1

DEP? Oder falsche Informationen vom Debugger. –

+2

Bist du sicher, dass es das "Sub" ist, das versagt? Will RIP nicht auf den Befehl nach dem Fehler zeigen ...? – cHao

+0

David, EXCEPTION_PARAMETER1 sagt 0, also ist es nicht DEP. – cassandrad

Antwort

2

Etwas anderes geht weiter. Es gibt keine Speicherleseoperation innerhalb des gesamten Opcode-Satzes. Sie haben nur zwei Schreibvorgänge (Push und Mov). Ihre Ausrichtung ist in Ordnung, und das Setzen des unmittelbaren qword-Wertes -2 erfolgt in einer Region des Stapels, die OK sein sollte.

Die Bitiness des Betriebssystems und Opcodes haben nichts damit zu tun. Ich benutze die 64-Bit-Register die ganze Zeit. Es ist wie 32-Bit zu verwenden, wenn alles 16-Bit war.

Suchen Sie anderswo.

Verwandte Themen