Was ist der Unterschied zwischen einem "segmentation fault" und ein stack-overflow?
Wenn wir zum Beispiel aufrufen, sagen Sie, eine rekursive Funktion, die aufeinander folgende Aufrufe auf dem stack gespeichert werden. Jedoch, aufgrund eines Fehlers, wenn es geht auf unendlich die Fehlermeldung 'Segmentation fault' (wie man auf GCC).
Sollte es nicht gewesen "stack-überlauf"? Was ist dann der grundlegende Unterschied zwischen den beiden?
Btw, eine Erklärung wäre hilfreicher als wikipedia-links (durchgemacht, aber keine Antwort auf die spezifische Abfrage).
- Überlauf Zeug über Fragen zur Programmierung, Fehler-Zeug über die Server. oO
- Was bedeutet SIGSEGV zu tun haben mit dem Server? Obwohl server-Anwendungen kann die Ursache für segmentation fault, dass wirklich nichts zu tun hat mit der server-administration und alles zu tun mit der Programmierung.
- serverfault.com und schwups.
- Ich denke, es ist eine Posix-Beschränkung, es unterstützt nicht SIGSTKFLT.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stack overflow [a] führen, "segmentation fault" ist das Ergebnis.
Zumindest auf x86-und ARM, das "stack" ist ein Teil des Speichers reserviert für das Inverkehrbringen lokale Variablen und return-Adressen von Funktionsaufrufen. Wenn der Stapel aufgebraucht ist, wird der Speicher außerhalb des reservierten Bereichs zugegriffen wird. Aber die app hat nicht gefragt, die der kernel für diese Speicher, so ein SegFault erzeugt werden für den Speicherschutz.
Den call-stack ist übergelaufen, aber das Ergebnis der überfüllt ist, dass schließlich nennen-die zugehörigen Werte werden in den Speicher geschoben, der nicht Teil des Stapels und dann -
SIGSEGV
!Moderner Prozessoren, Speicher-Manager zu schützen, die Prozesse von einander. Die x86-Speicher-manager hat viele legacy-Funktionen, eine davon ist die Segmentierung. Segmentierung ist gemeint, damit Programme manipulieren Gedächtnis in einer bestimmten Weise. Zum Beispiel, in einem segment möglicherweise schreibgeschützt markiert und der code gesetzt werden würde, während ein anderes segment ist Lesen/schreiben und das ist, wo Ihre Daten geht.
Während ein stack-überlauf, Sie Auspuff alle der Speicherplatz auf einem Ihrer Segmente, und dann Ihr Programm beginnt, schreiben in Segmente, die der Speicher-manager nicht erlauben, und dann bekommt man einen segmentation fault.
Einen stack-overflow kann sich als eine explizite stack-überlauf-Ausnahme (je nach compiler und Architektur) oder als ein "segmentation fault", D. H., invalid memory access. Letztlich ist ein stack-überlauf ist das Ergebnis von running out of stack space, und eine mögliche Folge von running out of stack space ist das Lesen oder schreiben auf Speicher, die sollte man nicht zugreifen. Daher werden auf vielen Plattformen, das Ergebnis ist ein stack-überlauf ist ein memory access Fehler.