2016-06-10 66 views
-1

Es gibt einige Tricks beim Üben von C++ - Programmierern wie "Scope Guard" und anderen, die Referenzen auf Provisorien enthalten.Gibt es eine gute Möglichkeit, den Stack des Aufrufers in C++ zu zerstören?

Ich bin kein praktizierender C++ - Programmierer, aber ich würde (neugierig) fragen, ob es eine Möglichkeit gibt, wie eine Drittanbieter-Bibliothek den Stapel der Anrufer irgendwie beschädigen könnte. Vielleicht mit plötzlichen Destruktoren oder einer anderen lebenslangen Magie?

+1

Sicher, eine Third-Party-Bibliothek kann den Stapel des Anrufers leicht wegblasen. Es braucht nicht viel Geschick, um fehlerhaften Code zu schreiben. Die wahre Fähigkeit besteht darin, fehlerfreien Code zu schreiben. Das ist der schwierige Teil. –

+0

'exit (0)' neigt dazu, den Stapel (und alles andere) zu zerstören. Ich denke nicht, dass das wirklich eine gute Frage ist. – MSalters

+0

@MSalters Vielen Dank für das Feedback. Fühlen Sie sich frei, die Frage zu schließen. Meine ursprüngliche Absicht war mehr über die Verweise auf zurückgegebene Provisorien und Destruktoren etc. – rostamn739

Antwort

3

Weise Dritte Bibliothek könnte die Stapel Anrufer schaden

Wenn Code aus der dritten Teil Bibliothek läuft - ob eine Initialisierungsroutine für eine dynamisch geladene Bibliothek, die die OS-Loader zu nennen wissen, oder einen expliziter Aufruf aus dem Clientanwendungscode, der in der Regel (in den meisten Betriebssystemen/Implementierungen) die Fähigkeit besitzt, mit dem Stack (oder jedem anderen Speicher) wie mit der Clientanwendung selbst zu arbeiten; zum Beispiel:

void library_code() 
{ 
    char x; 
    char* p = &x; 
    *(p - 2) = 23; // undefined behaviour - may do nothing or anything, 
        // but usually overwrites stack or SIGSEGVs 
    *(p + 54) = 99; // stacks might grow up or down, so may have to + or - 
        // from &x to address in-use stack memory... 
} 
+0

Danke! Ich denke, das gilt gleichermaßen für die Region des spezifischen Anrufers (oder sagen wir Frame) des Anrufstapels. Könnten Sie sich ein Beispiel mit Scopes/Lifetime/RAII vorstellen? :) – rostamn739

+1

Der Stapel neigt dazu, ein zusammenhängender Speicherbereich statt disjoint Adressregionen zu sein; Rahmen sind nur Bytes darin, die momentan von einer bestimmten Funktion in dem aktuellen Aufrufstapel verwendet werden, wobei nach dem Aufruf einige gespeicherte CPU/GPU-Register sowie eine Rücksprungadresse gefolgt von den Funktionsparametern und lokalen Variablen vorhanden sein können dass der Compiler entschieden hat, den Stack anzulegen. Re scopes/lifetime/RAII - jeder Destruktor eines Stack-gehosteten Objekts kann die gleiche Art von Stack-Trash über den 'this'-Zeiger ausführen. –