Tools zum Umgang mit Stack Corruption in C ++

8

EDIT: Aufgrund eines Kommentars, der zu meinem Beispiel richtig war, habe ich es entfernt und dies zu einer allgemeinen Frage gemacht:

Manchmal stolpere ich bei meinen Projekten über Korruption. Egal, wie sehr ich darum kämpfe, Code zu schreiben, um es zu vermeiden, manchmal ist es einfach unvermeidbar. Aber wenn es passiert, wie kann man es bekämpfen?

Ich habe ein Makro gefunden, das der gute Kerl in diesem Blog angegeben hat: Ссылка liest den ebp-Registerwert, um eine Beschädigung zu erkennen.

Aber es wird bestimmt anspruchsvollere Werkzeuge geben, die dir dabei helfen, dich nicht auf den Fuß zu schießen. Ich programmiere in Windows mit Codeblocks und dem GCC-Compiler. Der Grund, warum ich diese Frage stelle, ist, Werkzeuge zu finden, die ich in meiner Programmierumgebung verwenden kann, um mir zu helfen, solche Fehler zu erkennen und zu korrigieren. Irgendwelche Vorschläge?

Danke für die Antworten und dafür, dass Sie sich die Zeit genommen haben, meine Frage zu lesen.

    
Lefteris 18.01.2011, 05:05
quelle

2 Antworten

4

Es ist bei weitem nicht unklar, ob Sie stack Korruption haben. Aber ich akzeptiere, dass es einige Datenkorruption gibt.

Eine einigermaßen effektive Methode ist das Hinzufügen von Schutzfeldern um das / die verdächtige (n) Feld (er):

%Vor%

Lassen Sie den Konstruktor diese zu den meisten Dingen initialisieren, aber ohne die Art der Verfälschung zu kennen, scheint etwas, das nicht Null ist, befriedigender zu sein.

%Vor%

Fügen Sie eine Memberfunktion für die Konsistenzprüfung hinzu:

%Vor%

Dann pfeffer den Code mit Aufrufen dazu, besonders in der Nähe verdächtiger Logik. Wenn Sie mit einem Debugger vertraut sind, platzieren Sie einen Haltepunkt in der Fehlermeldung. Indem Sie den Stapel entschlüsseln, können Sie feststellen, was das Programm in letzter Zeit gemacht hat, und Hinweise darauf sammeln, welches Bit des Codes wahrscheinlich außerhalb der richtigen Grenzen geschrieben wird.

    
wallyk 18.01.2011, 05:30
quelle
1

Valgrind findet alle Arten von Speicherkorruption.

GCC hat mudflap ( -fmudflap und Freunde) und -fstack-protector , um Speicherzugriffsprobleme zu bekommen. Andere Compiler tun es wahrscheinlich auch.

    
derobert 18.01.2011 05:38
quelle

Tags und Links