Absturz durch falsche Adresse verhindern. Aber wie?
-
Guten Tag,
Ich habe ein kleines Programm geschrieben, bei dem man eine Arbeitsspeicher-
Adresse eingeben kann und es dann den Wert der betreffenden Adresse ausgibt.
Hier ist der Code-Ausschnitt://.. int adresse=0; cout >> "Geben sie eine Adresse ein: "; cin >> adresse; int *p = (int*)(adresse); // Adresse von oben cout << *p << endl; // Wert ausgeben // ...Wenn ich jetzt eine Adresse eingebe die nicht benutzt wird oder auf die nicht
zu gegriffen werden kann, da ich kein WinApi benutze, stürzt das Programm ab.
Ich wollte Sie nun fragen ob es eine Möglichkeit gibt die Lesbarkeit der
Adresse zu überprüfen bevor das Programm versucht sie auszulesen und damit den
Absturz zuvermeiden.
Vielen Dank schon mal.
Mit freundlichen Grüßen
MorphysX
-
du könntest ein try { } catch benutzen, aber was soll das Programm überhaupt machen?
greetz KN4CK3R
-
Danke für die Antwort ich werde es gleich mal probieren und auf deine Frage zu
antworten. Das Programm soll aus seinem eigenen Arbeitsspeicher-Bereicht den Wert
einer bestimmten Adresse ausgeben (Die vorher eingeben wird). Ich weiß das klingt
nicht sinnvoll aber es ist auch nur ein Versuch um später auf dieser Basis ein
größeres Projekt zu starten.Grüße
MorphysX
-
klingt im kleinen Programm nicht sinnvoll und im größeren schon gar nicht...
greetz KN4CK3R
-
KN4CK3R schrieb:
du könntest ein try { } catch benutzen
Nein. Wie soll das funktionieren? Welche Exception wird geworfen?
@MorphysX
Auf eine Adresse die nicht dir "gehört" zuzugreifen ist undefiniertes Verhalten, im besten Fall stürzt das Programm einfach ab. (Vielleicht bestellt es auch eine leckere Pizza für Dich. ;))Soweit ich weiß, gibt es keinen Standardkonformen weg, Adressen darauf zu überprüfen, ob du darauf zugreifen darfst. Insofern wirst du um Systemfunktionen nicht herum kommen.
-
Also ich habe dein Vorschlag getestet leider hat er nicht geholfen, denn so bald
das Programm versucht den Wert auszugeben stürzt es immer noch ab mit try {}
catch oder ohne. Ja, mag für außenstehende wirklich so scheinen aber ich habe mir
da schon eine sinnvolle verwendung einfallen lassen. Aber wenn es so weiter geht
sehe ich mich doch gezwungen WinApi zu nutzen. Oder hat sonst noch jemand einen
Vorschlag wie man das oben beschriebene Problem umgehen könnte?grüße MorphysX
-
@cooky451
Das Programm soll ja auch gar nicht auf Arbeitsspeicher-Adressen zu greifen die
von einem anderen Programm belegt sind. Sondern nur auf seine eigenen. Das
Problem ist es erkennt nicht welche zu ihm gehören und welche nicht und das
Problem ist es was ich lösen möcht.
-
Wie gesagt, ich denke nicht, dass du die Adressen auf die du zugreifen darfst irgendwie identifizieren kannst. (Mit der WinAPI geht das natürlich.)
Allerdings frage ich mich auch, wozu das gut sein soll..
-
Okay, danke das ihr mir weiter geholfen habt. Dann werde ich mal mein Programm ändern.
-
cooky451 schrieb:
KN4CK3R schrieb:
du könntest ein try { } catch benutzen
Nein. Wie soll das funktionieren? Welche Exception wird geworfen?
macht das nicht IsBadReadPtr aus der WinAPI so? Falls nicht, ziehe ich meine Antwort von vorhin zurück.
greetz KN4CK3R
-
KN4CK3R schrieb:
macht das nicht IsBadReadPtr aus der WinAPI so? Falls nicht, ziehe ich meine Antwort von vorhin zurück.
Hä? Seit wann ist irgendein Befehl der WinAPI im Standard verankert? Er hat doch explizit nach nicht WinAPI Lösungen gefragt. Und den Aufruf hätte man vielleicht in der Antwort erwähnen sollen, da stand nur try/catch. Und nein, die Funktion wirft natürlich auch keine Exception.