Warum kann ich nicht die Ursache für die seg-fault?
OK aus welchem Grund auch immer ich habe Probleme, verursacht einen seg fault. Ich will zu produzieren, so dass ich verwenden können gdb
zu sehen, wie zum Debuggen ein. Ich habe versucht die beiden Beispiele aus der Wikipedia Artikel doch weder die Arbeit.
Die erste:
char *s = "Hello World!";
*s = 'H';
Und das zweite Beispiel:
int main(void)
{
main();
}
EDIT: ich bin mit Ubutnu 9.10 und g++
wie mein compiler. Kann jemand mir zeigen einige code, der garantiert, dass segfault?
- Das Verhalten der obige code ist undefiniert, was bedeutet, es kann nicht alles, was es will, einschließlich der "scheinbaren arbeiten", oder verursachen Sie nasale Dämonen. 🙂
- versuchen char* = reinterpret_cast<char*>(0x1234); p[0] = 'H';
- Wenn Sie möchten, zu einem seg-fault, ich könnte Ihnen einige C++ - Programme, die ich schrieb in der Hochschule 🙂
- Kompilieren Sie mit dem Befehl aus dem Artikel segfaults bei mir (gcc segfault.c -g -o segfault)
- Viele der Antworten garantieren einen segfault. Haben Sie Probleme mit Ihnen?
- Streng genommen, keine Antwort garantiert einen segfault. Das wäre die Definition nicht definiertes Verhalten.
- Wissen Sie, WIE viele Male habe ich WÜNSCHTE, ich hätte dein problem? B-)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es impossable, um zu versuchen und zuverlässig tun es die Dereferenzierung von Zeigern.
Dies ist, weil, wie die Anwendung mit Speicher umgeht kann sich von compiler zu compiler auch über den gleichen compiler mit anderen Optionen (debug/release-Modus vorgeführt anders).
Was Sie tun können, ist ausdrücklich heben Sie den segfault mit einem signal:
Meine eine Zeile Geschmack:
vm.mmap_min_addr
.Kürzeste segfault immer:
*(short*)0=0
lolBeide die Dinge, die Sie tun, zu produzieren "Undefiniertes Verhalten" in C++ (naja, Aufruf von main() ist eigentlich explizit verboten). Es gibt keine Garantie, dass Sie Ursache seg faults - das hängt von einer Menge Dinge, aber vor allem der Plattform, die Sie ausführen auf, die Sie noch nicht angegeben.
In der Tat alle vorgeschlagene Methode verursacht einen seg fault möglicherweise oder möglicherweise nicht arbeiten. Dies ist denn ein seg-fault, ist fast immer im Zusammenhang mit C++'s Konzept der Undefiniertes Verhalten.
int *p = 0; while (true) *p++ = 10;
wird in der einen oder anderen Treffer ein Speicherbereich, der nicht beschreibbar durch den Prozess, und unter linux oder macosx löst einen " segmentation fault)oder definieren Sie eine Struktur (z.B. "HelloWorld" struct)
Für das erste Beispiel der compiler wahrscheinlich setzen Sie die Zeichenfolge in beschreibbarer Speicher, so gibt es keinen seg-fault, wenn Sie versuchen, es zu ändern.
Für den zweiten, der compiler kann optimieren den Anruf Weg oder kann die Optimierung der Anruf selbst entfernt, um nur ein Sprung, da es ein Schwanz Anruf), d.h. der stack ist nicht, wächst tatsächlich mit der return-Adressen für jeden Anruf, so konnte man recurse auf unbestimmte Zeit.
Aber als Neil erwähnt in seinem Beitrag, alle diese Dinge, die Ergebnisse in "Undefiniertes Verhalten", so der code ist nicht erforderlich, zur Laufzeit zu generieren, einen seg-fault.
Viele Methoden zum generieren von einem segfault.
Wie die Dereferenzierung eine schlechte Zeiger:
0xDEADBEEF
ist eine Zahl. "Hallo Welt" ist ein string. In diesem Falls
endet verweist auf Speicher-Adresse0xDEADBEEF
, die (höchstwahrscheinlich) komplett ungültig. In OP ' s Beispiels
endet mit der Adresse des Strings - wenn der compiler Sie noch nicht, erklärte der Speicher als nur-lese -, kein Fehler führt, wenn wir versuchen, zu schreiben.Wikipedia-Artikel tatsächlich beschreibt drei Methoden (eine davon ist eine null-Zeiger-Dereferenzierung); warum nicht Sie versuchen, diese ein?
Als für die Frage, warum die beiden Beispiele, die Sie versucht nicht, gut, die richtige Antwort als die anderen gemerkt haben, dass es zu undefiniertem Verhalten, so alles passieren könnte (das schließt nicht segfaulting). Man könnte aber spekulieren, dass der Grund, dass die erste form nicht scheitern für dich ist, weil dein compiler oder das system ist lasch über die Speicher-Schutz. Als für den zweiten Fall, eine tail-rekursive-bewusst-compiler möglicherweise könnte die Optimierung der unendlich rekursiven
main
Schleife und am Ende nicht überläuft den Stapel.Beim verketten von zwei Konstanten... erhalten Sie ein... zumindest ist ein einfacher Weg...
strcat("a", "b");
=)