Wie erkennt man mögliche / potentielle Stapelüberlaufprobleme in einem c / c ++ Programm?
Ist es ein standard-Weg, um zu sehen, wie viel stack-Speicher für Ihre app und, was der höchsten Wasserzeichen für die stack-Nutzung ist es beim laufen?
Auch in die gefürchtete Falle des tatsächlichen überlauf was passiert?
Stuerzt es ab, eine Ausnahme auszulösen, oder signal? Gibt es da einen standard oder ist es bei den verschiedenen Systemen und Compilern?
Ich bin auf der Suche speziell für Windows, Linux und Macintosh.
InformationsquelleAutor der Frage KPexEA | 2008-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auf Windows ein stack-überlauf Ausnahme generiert werden.
Den folgenden windows-code veranschaulicht dies:
Wenn diese exe-Datei ausführen, wird die folgende Ausgabe generiert:
InformationsquelleAutor der Antwort jussij
Unter Linux erhalten Sie einen segmentation fault, wenn der code versucht zu schreiben, hinter den stack.
Die Größe des stack ist eine Eigenschaft geerbt, die zwischen Prozessen. Wenn Sie Lesen oder ändern können es in der shell mit Befehlen wie
ulimit -s
(insh
ksh
zsh
) oderlimit stacksize
(tcsh
zsh
).Aus einem Programm, die Größe des stack gelesen werden können, mit
Ich kenne keine standard-Weg, um die Größe des verfügbaren Stapel.
Dem Stapel beginnt mit
argc
gefolgt von den Inhaltargv
und eine Kopie von der Umwelt, und dann die Variablen. Jedoch, da der kernel kann, mischen Sie die Position des anfangs des Stapels, und es kann einige dummy-Werte überargc
es wäre falsch, davon auszugehen, dass Siel.rlim_cur
bytes verfügbar unter&argc
.Einer Weise abzurufen, die genaue Lage der stack ist ein Blick auf die Datei
/proc/1234/maps
(wo1234
ist die Prozess-ID des Programms). Sobald Sie wissen, diese Schranken können Sie berechnen, wie viel von Ihrem Stapel verwendet wird, indem man die Adresse der aktuellen lokalen Variablen.InformationsquelleAutor der Antwort adl
gcc stellen einen zusätzlichen Speicherblock, der zwischen der Rückkehr-Adresse und die normalen Variablen, die in "unsichere" Funktion Aufrufe, wie (in diesem Beispiel ist die Funktion void test() {char a[10]; b[20]}:
Wenn die Funktion write-36 bytes der pointer "a", der überlauf "korrupten" die Rückkehr-Adresse (mögliche Verletzung der Sicherheit). Aber es wird auch ändern Sie den Wert des 'dummy', das ist zwischen dem Zeiger und der Rückkehr-Adresse, so dass das Programm stürzt mit einer Warnung (Sie können diese deaktivieren, mit ein -fno-stack-protector)
InformationsquelleAutor der Antwort
Unter Linux, die Gnu libsigsegv Bibliothek beinhaltet die Funktion
stackoverflow_install_handler
die erkennen können (und in einigen Fällen helfen Sie wiederherstellen aus) stack-überlauf.InformationsquelleAutor der Antwort Norman Ramsey
Stack-überlauf ist wohl die übelste Art von Ausnahme zu behandeln-denn Ihre exception-handler zu kämpfen hat, mit einer minimalen Menge von stapeln (in der Regel nur eine einzelne Seite ist, für diesen Zweck reserviert).
Für eine interessante Diskussion der Schwierigkeiten Umgang mit dieser Art von Ausnahme siehe diese Blogbeiträge: Eins und Zwei von Chris Brumme, die sich auf die Frage aus dem .NETTO-Perspektive, besonders das hosting der CLR.
InformationsquelleAutor der Antwort Rob Walker
Unter windows, ist der stack (für den thread) wächst on-demand, bis der stack-Größe für diesen thread vor seiner Schaffung erreicht wurde.
On-demand wächst, ist impelmented mit guard-Seiten, dass es nur ein fragment der stack zuerst, gefolgt von einem Wächter Seite, die, sobald Sie getroffen werden, lösen eine Ausnahme, diese Ausnahme ist das Besondere, und übernimmt das system für Sie die Abwicklung erhöht die verfügbaren Stapelspeicher (auch aktiviert, wenn eine Grenze erreicht ist!) und die Lesen-operation wiederholt wird.
Sobald das limit erreicht ist, gibt es keine mehr wachsen, die Ergebnisse in einer stack-overflow-exception.
Die aktuelle stack-base-und limit sind gespeichert in thread environment block, in einem struct namens
_NT_TIB
(thread information block).Wenn Sie eine debugger-praktisch, das ist, was Sie sehen:
Dem StackLimit-Attribut wird aktualisiert on-demand.
Wenn Sie überprüfen Sie die Attribute, die auf diesen Speicher-block, sehen Sie etwas ähnliches wie:
Und Prüfung einer Seite neben darin offenbart sich das guard-Attribut:
Hoffe, es hilft.
InformationsquelleAutor der Antwort deemok
Ich würde dir empfehlen für die Verwendung von alternativen-signal-stack wenn Sie auf linux.
InformationsquelleAutor der Antwort Shyam Sunder Verma
Ist es möglich mit editbin in Visual Studio ändern Sie die stack-Größe. Die Informationen können an gefunden werden msdn.microsoft.com/en-us/library/35yc2tc3.aspx.
InformationsquelleAutor der Antwort Richard
Einige Compiler unterstützen stackavail () - Funktion gibt die Menge der verbleibenden freien Speicherplatz des Stacks. Mit dieser Funktion können Sie vor dem aufrufen von Funktionen in Ihre Programme, die erfordern viel stack-Speicher, um festzustellen, ob es sicher ist, Sie zu nennen
InformationsquelleAutor der Antwort dmityugov