Pointer Validation
-
Hi
Wie kann ich den Wert eines void* Pointers auslesen, bei welchem ich nicht über die Länge bescheid weiss?
Bisher habe ich das mit folgendem Code versucht zu bewältigen, jedoch treten immer wieder Access Violation trotz des Exceptionhandlings auf.
// Void* char* Temp = (char*)va_arg(Pointer,LPVOID); int i = 0; // Ceck accessability try { if(Temp != 0 && !IsBadReadPtr(Temp,sizeof(char))) { do { // Save value Buffer << Temp[i]; i++; } while (!IsBadReadPtr(Temp+i,sizeof(char)) && i < MAXLENGTH); } else // Save only address Buffer << &Temp; } catch(...){};MfG Joe
-
Fragen wir mal so: Warum willst Du das überhaupt machen?
Wenn Du nicht weisst was Du machst, solltest Du es auch nicht machen... just my 2 cents...
PS: C++-Exception handling ist eigentlich nicht für Access-Violations gedacht...
-
Ich schreibe eine Sandboxapplication, welche Winapifunktion unterbricht. Um nicht für jede Funktion einen eigenen Loghandler zu schreiben, was eine Unmenge an Arbeit bedeuten würde, habe ich dynamische Funktionen implementeriert. Jedoch mit dem Preis, dass ich die Länge von Pointern nicht mehr zu den jeweiligen Pointern zuweisen kann.
Ich weiss, dass IsBadReadPtr nicht zuverlässig funktioniert. Deshalb habe ich das Exceptionhandling verwendet.
MfG Joe
-
Falls du mit dem MSVC kompilierst könnte dass das sein wonach du suchst:
_set_se_translatorDamit kannst du dann die Hardwareexceptions abfangen und sofern möglich auch drauf reagieren.
-
Was willst du genau machen?
IsBadReadPtr ist eine Funktion die meiner Meinung nach nur etwas in einem Debugger zu suchen hat.
-
Ben04
Ich möchte den Wert eines Pointers ausgeben, bei welchem ich die Länge dieses Wertes nicht kenne.
Da die Sandbox eine Art Debugger darstellt ist IsBadReadPtr nicht fehl am Platz. Aber wie ich schon von diversen Seiten gehört habe funktioniert IsBadReadPtr nicht richtig. Ich suche also nach einer Alternative.
http://blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx
MfG Joe
-
[JoE] schrieb:
Ich möchte den Wert eines Pointers ausgeben, bei welchem ich die Länge dieses Wertes nicht kenne.
Ähm ... der Wert eines Pointers ist eigentlich die referenzierte Adresse (wobei ich glaube Du meinst etwas anderes
), das geht einfach so:#include <iostream> int main() { using namespace std; int iData = 12; void* pvRef = &iData; cout << "Adresse von iData ist: " << hex << "0x" << pvRef << endl; return (0); }[JoE] schrieb:
Da die Sandbox eine Art Debugger darstellt ist IsBadReadPtr nicht fehl am Platz. Aber wie ich schon von diversen Seiten gehört habe funktioniert IsBadReadPtr nicht richtig. Ich suche also nach einer Alternative.
Ähm man könnte auch sagen, dass das Verwenden von IsBadReadPtr mehr Fehler erzeugt, als eigentlich verhindern sollte
.
-
[JoE] schrieb:
Ich schreibe eine Sandboxapplication, welche Winapifunktion unterbricht. Um nicht für jede Funktion einen eigenen Loghandler zu schreiben, was eine Unmenge an Arbeit bedeuten würde, habe ich dynamische Funktionen implementeriert. Jedoch mit dem Preis, dass ich die Länge von Pointern nicht mehr zu den jeweiligen Pointern zuweisen kann.
Ich weiss, dass IsBadReadPtr nicht zuverlässig funktioniert. Deshalb habe ich das Exceptionhandling verwendet.
MfG Joe
Dann probiers mit __try + __catch statt try + catch

Damit kannst du (wenn du mit support für asynchrone exceptions compilierst) Dinge wie access violations schön fangen.
Beispiele sollten in der MSDN zu hauf zu finden sein. Ahja, du kannst __try nicht mit try innerhalb der selben Funktion mischen, allerdings ohne Probleme innerhalb des selben Programms/Callstacks -- notfalls also einfach eine Funktion in 2 teilen wenn du beides brauchst.