Schreiben Sie den kürzesten Code, der einen Segmentierungsfehler (SIGSEGV) auslöst, in einer beliebigen Programmiersprache.
75
Schreiben Sie den kürzesten Code, der einen Segmentierungsfehler (SIGSEGV) auslöst, in einer beliebigen Programmiersprache.
Antworten:
C, 5 Zeichen
Es handelt sich um eine Variablendeklaration. Der
int
Typ ist impliziert (Feature aus der Sprache B kopiert) und der0
Standardwert. Bei der Ausführung wird versucht, eine Zahl auszuführen (Zahlen sind nicht ausführbar) und verursachtSIGSEGV
.Probieren Sie es online!
quelle
0
.static
Variablen beginnen , wie0
, undmain;
iststatic
, wie ich es außerhalb Funktion erklärt. c-faq.com/decl/initval.htmlmain
ein int, der sich in.bss
befindet. In der Regel befinden sich Funktionen in.text
, wenn der Kernel das Elf-Programm lädt, für das er eine ausführbare Seite erstellt,.text
und nicht -executable für. Wenn Sie.bss
also main aufrufen, springen Sie zu einer nicht ausführbaren Seite, und die Ausführung von etwas auf einer solchen Seite ist eine Schutzverletzung.main __attribute__((section(".text#")))=0xc3;
FTFY (zumindest scheint es, ohne Absturz auf meinem x86 zurückzukehren).const main=195;
. So interessant es ist, dass es funktioniert, das Ziel dieser Code-Golf-Herausforderung war es, den Code fehlerfrei zu machen und nicht zu funktionieren :).Bash, 11
quelle
Assembly (Linux, x86-64), 1 Byte
Dieser Code ist fehlerhaft.
quelle
Python 2, 13
Windows meldet einen Fehlercode von c00000fd (Stack Overflow), von dem ich annehmen würde, dass es sich um einen Untertyp eines Segmentierungsfehlers handelt.
Dank Alex A. und Mego können Segmentierungsfehler auch auf Mac- und Linux-Systemen auftreten. Python ist die Sprache der Wahl, um Ihre Programme portabel zum Absturz zu bringen.
quelle
Segmentation fault: 11
auf MacSegmentation fault (core dumped)
unter LinuxpdfTeX (51)
Dies ist tatsächlich wahrscheinlich ein Fehler , aber es ist nicht in dem von Knuth geschriebenen Original-TeX vorhanden: Das Kompilieren des Codes mit
tex filename.tex
anstelle vonpdftex filename.tex
erzeugt keinen Segfault.quelle
LOLCODE, 4 Bytes
Funktioniert nicht online, nur im C-Interpreter.
quelle
Python, 33 Zeichen
Quelle: http://bugs.python.org/issue1215#msg143236
Python, 60 Zeichen
Quelle: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup
Dies ist die Python-Version, auf der ich teste:
Im Allgemeinen ist der Python-Interpreter schwer zum Absturz zu bringen, aber das Obige ist selektiver Missbrauch ...
quelle
Viertens - 3 Zeichen
(
@
ist ein Abruf)quelle
C 18
quelle
int func()
. dh eine Funktionint
, die zurückgibt und nicht spezifizierte Parameter verwendet. In diesem Fallraise
gibt eine Funktion int zurück, wobei ein int-Argument verwendet wird. Dies funktioniert also (auch wenn der Compiler sich beschwert).Perl (<5,14), 9 Zeichen
In 5.14 wurde die Regex-Engine reentrant gemacht, so dass sie nicht auf diese Weise abgestürzt werden konnte. In 5.12 und früheren Versionen tritt jedoch ein Fehler auf, wenn Sie dies versuchen.
quelle
W32 .com ausführbar - 0 Bytes
Dies scheint seltsam, aber auf 32 - Bit - Windows - Systemen erstellen und eine leere .com - Datei ausführen kann eine segfault verursachen, je nach ... etwas. DOS akzeptiert es einfach (der 8086 hat keine Speicherverwaltung, es sind keine bedeutenden Segmente zu bemängeln), und 64-Bit-Windows weigert sich, es auszuführen (x86-64 hat keinen v86-Modus, in dem eine .com-Datei ausgeführt werden kann).
quelle
Gehirnfick (2)
Ja, das ist implementierungsabhängig. SIGSEGV ist wahrscheinlich das Ergebnis eines guten Compilers.
quelle
<
sollte entweder keine Wirkung haben oder sich herumschlagen.Haskell, 31
Dies erzeugt einen Segfault, wenn es mit GHC kompiliert und ausgeführt wird. Es sind keine Erweiterungsflags erforderlich, da die Fremdfunktionsschnittstelle dem Haskell 2010-Standard entspricht.
quelle
C -
11 (19)7 (15)6 (14)1 Zeichen, AT & T x86-Assembler - 8 (24) ZeichenC-Version ist:
Das gesamte Programm (nicht ganz ISO-konform, nehmen wir an, es ist K & R C) besteht aus 19 Zeichen:
Assembler-Variante:
Das gesamte Programm ist 24 Zeichen lang (nur zur Bewertung, da es sich nicht um einen Assembler handelt):
EDIT :
Ein paar C-Varianten. Die erste Methode verwendet die Nullinitialisierung der globalen Zeigervariablen:
Die zweite Methode verwendet die unendliche Rekursion:
Die letzte Variante ist
die kürzeste -7 (15) Zeichen.EDIT 2 :
Erfand eine weitere Variante, die kürzer ist als eine der oben genannten - 6 (14) Zeichen. Es wird davon ausgegangen, dass Literalzeichenfolgen in einem schreibgeschützten Segment abgelegt werden.
EDIT 3 :
Und mein letzter Versuch - 1 Charakter lang:
Kompiliere es einfach so:
quelle
main
handelt es sich um eine mit Null initialisierte globale int-Variable. Was wir also erhalten, ist das Ergebnis des Versuchs, einige Null-Bytes auszuführen. In x86 wäre es so etwas wieadd %al,(%rax)
ein perfekt gültiger Befehl, der versucht, den Speicher unter der in gespeicherten Adresse zu erreichen%rax
. Die Chancen, dort eine gute Adresse zu haben, sind gering.DC - 7 Zeichen
verursacht einen Stapelüberlauf
quelle
[dx0]
speichertdx0
auf dem Stapel,d
dupliziert dann das oberste Stapelelement,x
fügt dann das oberste Stapelelement ein (dx0
) und führt es aus. Das oberste Stack-Element wird dupliziert und ausgeführt. Es0
muss vorhanden sein, um zu verhindern, dass dies ein Tail-Aufruf ist, damit sich alle Elemente aufbauen.Perl, 10/12 Zeichen
Eine etwas betrügerische Lösung besteht darin, einen Char von Joey Adams Bash-Trick zu entfernen :
Es liegt jedoch auf
unpack p
der Hand , einen echten Segfault in Perl zu erhalten :Technisch wird dies nicht garantiert segfault, da die Adresse 0x31313131 (oder 0x3131313131313131 auf 64-Bit - Systemen) nur auf gültigen Adressraum zufällig hindeuten könnte. Aber die Chancen stehen dagegen. Wenn Perl jemals auf Plattformen portiert wird, auf denen Zeiger länger als 64 Bit sind, muss die
x8
Anzahl erhöht werden.quelle
1x8
Ding?"11111111".
Python 33
Sendesignal 11 (SIGSEGV) in Python.
quelle
from os import*
undkill(getpid(),11)
OCaml, 13 Bytes
Hierbei wird die Funktion verwendet
Obj.magic
, die zwei beliebige Typen unsicher zwingt. In diesem Fall wird 0 (gespeichert als unmittelbarer Wert 1 aufgrund des vom GC verwendeten Tag-Bits) zu einem Funktionstyp (gespeichert als Zeiger) gezwungen. Daher wird versucht, die Adresse 1 zu dereferenzieren, und dies führt natürlich zu einem Fehler.quelle
it coerces 0 (stored as the immediate value 1)
- Warum wird 0 als 1 gespeichert?Obj.magic()0
ist ein char kürzer :)Bash, 4 Bytes
Golf gespielt
Fügen Sie das Skript rekursiv in sich selbst ein.
Erklärt
Die rekursive Operation "source" (.) Führt schließlich zu einem Stapelüberlauf, und da Bash nicht in libsigsegv integriert ist , führt dies zu einem SIGSEGV.
Beachten Sie, dass dies kein Fehler ist, sondern ein erwartetes Verhalten, wie hier beschrieben .
Prüfung
Probieren Sie es online!
quelle
Eigentlich ,
17 16 11 109 BytesProbieren Sie es online!
Wenn dies nicht zum Absturz führt, erhöhen Sie die Zahl (mehrstellige Zahlen sind in Tatsächlich mit einem vorangestellten Doppelpunkt angegeben).
Beeinträchtigt den Interpreter, indem ein Fehler in Python ausgenutzt wird , der tief verschachtelte
itertools.chain
Objekte umfasst, mit denen der+
Operator tatsächlich implementiert wird .quelle
C # - 62
Bearbeiten: 23
Muss mit / unsafe kompiliert werden, damit dies funktioniert. Aus irgendeinem Grund verstehe ich nicht,
*(int*)0=0
wirft nur eine NullReferenceException, während diese Version die richtige Zugriffsverletzung gibt.quelle
int i=*(int*)0;
gibt eine NullReferenceException für mich zurück.*(int*)-1=0
und erhalten eine Zugriffsverletzung.*(int*)0=0
eine Ausnahme ausgelöst wird, liegt wahrscheinlich an der Optimierung. Um die Überprüfungskosten zu vermeidennull
, entfernt das Optimierungsprogramm möglicherweise Nullprüfungen. Wenn jedoch ein Segfault auftritt, wird er möglicherweise erneut als ordnungsgemäß ausgewiesenNullReferenceException
.PicoLisp - 4 Zeichen
Dies ist beabsichtigtes Verhalten. Wie auf ihrer Website beschrieben:
quelle
F90 - 39 Bytes
Zusammenstellung:
Ausführung:
Materialien:
quelle
19 Zeichen in C
Es beschädigt den Rücksprungadressenwert der Hauptfunktion, sodass es bei der Rückgabe von ein SIGSEGV erhält
main
.quelle
J (6)
memf
bedeutet freien Speicher,1
wird als Zeiger interpretiert.quelle
Cython, 14
Dies ist häufig für Debugging-Zwecke nützlich.
quelle
Unix PDP-11-Assembly, 18 Bytes Binär, 7 Bytes Quelle
(Dies wird ein Thema für mich, vielleicht weil es die einzige Sprache ist, die ich kenne, die hier sonst niemand kennt.)
Inkrementiert das einzelne Byte, das durch den Anfangswert von r0 adressiert wird [der laut simh-Debugger zufällig 05162 ist], ab Programmstart.
Und wie immer können die überflüssigen Bytes am Ende mit strip entfernt werden.
Ich habe ein paar Versuche unternommen, die Quelle zu verkürzen, bekam aber immer entweder einen Syntaxfehler oder SIGBUS.
quelle
Matlab - Ja, das ist möglich!
In einer Antwort auf eine Frage von mir kam Amro mit dieser Eigenart:
quelle
JavaScript-Shell, 7 Byte
Löscht absolut alles, nicht nur das aktuelle Zielfernrohr, das offensichtlich viele Fehler verursacht, die dazu führen, dass JS in die Luft sprengt und Fehler verursacht
quelle
Pyth, 3 Zeichen
Dies wäre der Teil, in dem ich erkläre, wie ich auf diese Antwort gekommen bin, außer ich habe zu Recht keine Ahnung . Wenn mir jemand das erklären könnte, wäre ich dankbar.
Hier ist es in einem Online-Dolmetscher.
quelle
j
auf1
und0
, die versucht , konvertieren1
in der Basis0
. Warum das so ist, weiß ich nicht ...j
quadriert die Basis und ruft sich selbst rekursiv auf, bis die Basis mindestens so groß ist wie die Zahl. Da die Basis 0 ist, passiert das nie. Mit einem ausreichend hohen Rekursionslimit erhalten Sie einen Segfault.