Kürzester Code, der ein SIGSEGV auslöst

75

Schreiben Sie den kürzesten Code, der einen Segmentierungsfehler (SIGSEGV) auslöst, in einer beliebigen Programmiersprache.

Arya
quelle
30
Beeindruckend. Möglicherweise die kürzeste erfolgreiche Frage.
Matthew Roh

Antworten:

113

C, 5 Zeichen

main;

Es handelt sich um eine Variablendeklaration. Der intTyp ist impliziert (Feature aus der Sprache B kopiert) und der 0Standardwert. Bei der Ausführung wird versucht, eine Zahl auszuführen (Zahlen sind nicht ausführbar) und verursacht SIGSEGV.

Probieren Sie es online!

Konrad Borowski
quelle
5
@Macmade: Eigentlich ist es so 0. staticVariablen beginnen , wie 0, und main;ist static, wie ich es außerhalb Funktion erklärt. c-faq.com/decl/initval.html
Konrad Borowski
16
als ich das letzte mal mit diesem ding gespielt habe, habe ich herausgefunden, dass es einen anderen grund für den segfault gibt. Wenn Sie main aufrufen, springen Sie zunächst zum Speicherort von main, nicht zum Wert. Eine andere Sache ist mainein int, der sich in .bssbefindet. 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, .textund nicht -executable für. Wenn Sie .bssalso main aufrufen, springen Sie zu einer nicht ausführbaren Seite, und die Ausführung von etwas auf einer solchen Seite ist eine Schutzverletzung.
6.
23
Ja, Segfaults in C sind so ziemlich die Standardeinstellung: P
Paul Draper
1
main __attribute__((section(".text#")))=0xc3;FTFY (zumindest scheint es, ohne Absturz auf meinem x86 zurückzukehren).
Josxyqk
2
@jozxyqk oder kürzer 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 :).
Konrad Borowski
74

Bash, 11      

kill -11 $$
Joey Adams
quelle
44
Signal 11 in 11 Zeichen. Klingt plausibel.
nyuszika7h
12
@ nyuszika7h Ich wollte Ihren Kommentar positiv bewerten, aber Sie haben gerade 11 positive Bewertungen. Ich werde es dabei belassen. : P
HyperNeutrino
3
@AlexL. andere Leute scheinen das verdorben zu haben :(
theonlygusti
2
@theonlygusti Ja ... Das ist schade. :( Na ja, dann kann ich es jetzt
upvoten
2
Bis zu 42 Upvotes, kein Touchee!
Seadoggie01
39

Assembly (Linux, x86-64), 1 Byte

RET

Dieser Code ist fehlerhaft.

Amol Sharma
quelle
7
Als MSDOS .com-Datei wird sie ausgeführt und ohne Fehler beendet.
JB
10
Mein Punkt ist: Nur die Angabe von „Assembly“ reicht nicht aus, um einen Segfault zu erzielen.
JB
52
@JB: Unter MS DOS wird kein Programm jemals einen Segmentierungsfehler erzeugen. Das liegt daran, dass MS DOS im Real-Modus ausgeführt wird, in dem kein Speicherschutz vorhanden ist.
Celtschk
1
@celtschk IIRC NTVDM greift auf nicht vorhandene und nicht MS-DOS zugewiesene Adressen zurück.
ζ--
2
@celtschk: Sie können es sowieso so segfault: mov bx, 1000h; Shr Ebx, 4; mov eax, [ebx] -> CPU erhöht die zugrunde liegende SEGV (AFAIK, es gibt jedoch niemanden, der damit umgehen kann).
Joshua
26

Python 2, 13

exec'()'*7**6

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.

Feersum
quelle
7
Segmentation fault: 11auf Mac
Alex A.
7
Segmentation fault (core dumped)unter Linux
Mego
Hängt das zuerst auf?
Mega Man
1
@MegaMan Wie dauert es lange, bis es fertig ist? Nein, 7 ** 6 ist nur ungefähr 100K, es gibt also keine wahrnehmbare Verzögerung.
Feersum
Warum funktioniert das? Es scheint nicht auf Python 3.6.8 unter Mac OS.
Max Gasner
22

pdfTeX (51)

\def~#1{\meaning}\write0{\expandafter~\string}\bye

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.texanstelle von pdftex filename.texerzeugt keinen Segfault.

Bruno Le Floch
quelle
21

LOLCODE, 4 Bytes

OBTW

Funktioniert nicht online, nur im C-Interpreter.

ein Spaghetto
quelle
24
LOL FANCY CODE M8 8/8 KTHXBYE
Addison Crump
17

Python, 33 Zeichen

>>> import ctypes;ctypes.string_at(0)
Segmentation fault

Quelle: http://bugs.python.org/issue1215#msg143236

Python, 60 Zeichen

>>> import sys;sys.setrecursionlimit(1<<30);f=lambda f:f(f);f(f)
Segmentation fault

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:

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin

Im Allgemeinen ist der Python-Interpreter schwer zum Absturz zu bringen, aber das Obige ist selektiver Missbrauch ...

ChristopheD
quelle
16

Viertens - 3 Zeichen

0 @

( @ist ein Abruf)

Troy Deck
quelle
1
Kürzeste bisher, die auf modernen Systemen funktioniert.
Demi
2
Welcher weiter? Gforth sagt nur "Ungültige Speicheradresse"
Katze
15

C 18

main(){raise(11);}
Hasturkun
quelle
Müssen Sie #include <signal.h> in die Codeliste aufnehmen?
Florian Castellane
5
@FlorianCastellane: In C90 und niedriger deklariert der Compiler jeden Funktionsaufruf, der ohne sichtbare Deklaration ausgeführt wird, implizit als int func(). dh eine Funktion int, die zurückgibt und nicht spezifizierte Parameter verwendet. In diesem Fall raisegibt eine Funktion int zurück, wobei ein int-Argument verwendet wird. Dies funktioniert also (auch wenn der Compiler sich beschwert).
Hasturkun
14

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.

whio
quelle
Ich kann das auf Perl 5.14 (Debian) und 5.18 (Arch Linux) reproduzieren. sprunge.us/RKHT
nyuszika7h
Wiedergabe mit Perl v5.20.2 (Windows)
mehi
14

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).

Orion
quelle
13

Gehirnfick (2)

<.

Ja, das ist implementierungsabhängig. SIGSEGV ist wahrscheinlich das Ergebnis eines guten Compilers.

Daniel Cristofani
quelle
4
Wie funktioniert ein Compiler, der dieses "Gute" als Standard verwendet? Das <sollte entweder keine Wirkung haben oder sich herumschlagen.
Nyuszika7h
12
Das sofortige Erzeugen eines Laufzeitfehlers bei einer Grenzwertverletzung ist am besten, da der Programmierer den Fehler so schnell wie möglich finden und beheben kann. Wenn das fehlerhafte Programm eine Weile ausgeführt wird und der Speicher vor dem Absturz willkürlich beschädigt wird, ist das Problem nur schwieriger zu diagnostizieren. Wie Sie meinen, ist es am schlimmsten, den Absturz vollständig zu verhindern. Der Programmierer kann das Programm "zum Laufen bringen" und dann öffentlich gedemütigt werden, wenn es auf Standardcompilern und -interpreten abstürzt.
Daniel Cristofani
1
Umgekehrt ist das Abfangen von Grenzwertverletzungen vor der Laufzeit im Allgemeinen nicht möglich und in den Fällen, in denen dies möglich ist, auch nicht besonders nützlich. Es wäre in Ordnung, einen aussagekräftigeren Laufzeitfehler zu erzeugen, aber es ist großartig, wenn das Betriebssystem ihn als Segfault abfängt, da er keine Kosten für die Geschwindigkeit verursacht. (Falls nicht klar ist, dass der Compiler selbst keine Seg-Fehler aufweist - es werden ausführbare Dateien erstellt, die eine Seg-Fehler aufweisen, sobald sie versuchen, außerhalb der Grenzen auf den Speicher zuzugreifen.)
Daniel Cristofani
4
Können Sie eine Implementierung bereitstellen, die dieses Verhalten erzeugt und vor dem Posten dieser Herausforderung erstellt wurde? Wenn nicht, ist diese Antwort ungültig.
Mego
1
Bounds Checks sind implementierungsspezifisch, daher bin ich mir sicher, dass es einige gibt, bei denen Fehler auftreten könnten. Würde es allerdings ein SIGSEGV geben? Das bezweifle ich. Es gibt jedoch eine große Anzahl von Programmen, die davon abhängen, ob das Array links umbrochen wird. Es kann sehr praktisch sein, beidseitig anbaubare Lager zu haben.
captncraig
12

Haskell, 31

foreign import ccall main::IO()

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.

Joey Adams
quelle
10

C - 11 (19) 7 (15) 6 (14) 1 Zeichen, AT & T x86-Assembler - 8 (24) Zeichen

C-Version ist:

*(int*)0=0;

Das gesamte Programm (nicht ganz ISO-konform, nehmen wir an, es ist K & R C) besteht aus 19 Zeichen:

main(){*(int*)0=0;}

Assembler-Variante:

orl $0,0

Das gesamte Programm ist 24 Zeichen lang (nur zur Bewertung, da es sich nicht um einen Assembler handelt):

main(){asm("orl $0,0");}

EDIT :

Ein paar C-Varianten. Die erste Methode verwendet die Nullinitialisierung der globalen Zeigervariablen:

*p;main(){*p=0;}

Die zweite Methode verwendet die unendliche Rekursion:

main(){main();}

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.

main(){*""=0;}

EDIT 3 :

Und mein letzter Versuch - 1 Charakter lang:

P

Kompiliere es einfach so:

cc -o segv -DP="main(){main();}" segv.c
Alexander Bakulin
quelle
3
in C ist nicht main; nur 5 Zeichen
Arya
1
: Linker überprüft nicht, ob main funktioniert oder nicht. Es wird nur an den Loader übergeben und sigsegv
Arya
1
@FUZxxl In diesem Fall mainhandelt 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 wie add %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.
Alexander Bakulin
6
Natürlich kann der letzte Eintrag für alles verwendet werden, Sie müssen nur die richtigen Compiler-Argumente angeben. Was es zum automatischen Gewinner eines Code-Golf-Wettbewerbs machen sollte. :-)
celtschk
5
Normalerweise werden andere Compiler-Flags als diejenigen, die die zu verwendende Sprachversion auswählen, auf die Gesamtsumme angerechnet.
Jerry Jeremiah
9

DC - 7 Zeichen

[dx0]dx

verursacht einen Stapelüberlauf

Geoff Reedy
quelle
Ist funktioniert, aber können Sie näher darauf eingehen? Warum verhält es sich so?
Stéphane Gourichon
2
[dx0]speichert dx0auf dem Stapel, ddupliziert dann das oberste Stapelelement, xfügt dann das oberste Stapelelement ein ( dx0) und führt es aus. Das oberste Stack-Element wird dupliziert und ausgeführt. Es 0muss vorhanden sein, um zu verhindern, dass dies ein Tail-Aufruf ist, damit sich alle Elemente aufbauen.
Ben Millwood
8

Perl, 10/12 Zeichen

Eine etwas betrügerische Lösung besteht darin, einen Char von Joey Adams Bash-Trick zu entfernen :

kill 11,$$

Es liegt jedoch auf unpack pder Hand , einen echten Segfault in Perl zu erhalten :

unpack p,1x8

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 x8Anzahl erhöht werden.

Ilmari Karonen
quelle
1
Was ist das für ein 1x8Ding?
Hannes Karppila
@HannesKarppila Es ist ein kurzer Weg zu schreiben"11111111".
Ilmari Karonen
8

Python 33

import os
os.kill(os.getpid(),11)

Sendesignal 11 (SIGSEGV) in Python.

Daniel
quelle
2
Auch 33 Zeichen: from os import*undkill(getpid(),11)
Timtech
8

OCaml, 13 Bytes

Obj.magic 0 0

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.

Demi
quelle
1
it coerces 0 (stored as the immediate value 1)- Warum wird 0 als 1 gespeichert?
Skyler
1
@ Skyler siehe bearbeiten
Demi
1
Obj.magic()0ist ein char kürzer :)
Ben Millwood
8

Bash, 4 Bytes

Golf gespielt

. $0

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

./bang 
Segmentation fault (core dumped)

Probieren Sie es online!

Zeppelin
quelle
8

Eigentlich , 17 16 11 10 9 Bytes

⌠[]+⌡9!*.

Probieren 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.chainObjekte umfasst, mit denen der +Operator tatsächlich implementiert wird .

Pfeffer
quelle
7

C # - 62

System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);

Bearbeiten: 23

unsafe{int i=*(int*)0;}

Muss mit / unsafe kompiliert werden, damit dies funktioniert. Aus irgendeinem Grund verstehe ich nicht, *(int*)0=0wirft nur eine NullReferenceException, während diese Version die richtige Zugriffsverletzung gibt.

captncraig
quelle
Das int i=*(int*)0;gibt eine NullReferenceException für mich zurück.
Peter Olson
Sie können versuchen, auf einen negativen Speicherort zuzugreifen, *(int*)-1=0und erhalten eine Zugriffsverletzung.
Peter Olson
Die besondere Ausnahme ist genau das, was der CLR einhüllt, und ist unbedeutend. Das Betriebssystem selbst gibt in all diesen Fällen den Seg-Fehler aus.
captncraig
Der Grund, warum *(int*)0=0eine Ausnahme ausgelöst wird, liegt wahrscheinlich an der Optimierung. Um die Überprüfungskosten zu vermeiden null, entfernt das Optimierungsprogramm möglicherweise Nullprüfungen. Wenn jedoch ein Segfault auftritt, wird er möglicherweise erneut als ordnungsgemäß ausgewiesen NullReferenceException.
Konrad Borowski
7

PicoLisp - 4 Zeichen

$ pil
: ('0)
Segmentation fault

Dies ist beabsichtigtes Verhalten. Wie auf ihrer Website beschrieben:

Wenn einige Programmiersprachen behaupten, das "Schweizer Taschenmesser der Programmierung" zu sein, kann PicoLisp als "Skalpell der Programmierung" bezeichnet werden: Scharf, genau, klein und leicht, aber auch gefährlich in der Hand von Unerfahrenen.

Pierre Carrier
quelle
7

F90 - 39 Bytes

real,pointer::p(:)=>null()
p(1)=0.
end

Zusammenstellung:

gfortran segv.f90 -o segv 

Ausführung:

./segv 

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x7FF85FCAE777
#1  0x7FF85FCAED7E
#2  0x7FF85F906D3F
#3  0x40068F in MAIN__ at segv.f90:?
Erreur de segmentation (core dumped)

Materialien:

gfortran --version
GNU Fortran (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
frozar
quelle
1
Schöner erster Beitrag.
25.
6

19 Zeichen in C

main(a){*(&a-1)=1;}

Es beschädigt den Rücksprungadressenwert der Hauptfunktion, sodass es bei der Rückgabe von ein SIGSEGV erhält main.

saeedn
quelle
Dies hängt vom Stack-Frame-Layout ab. In einigen Architekturen kann dies möglicherweise nicht fehlschlagen.
Alexander Bakulin
6

J (6)

memf 1

memfbedeutet freien Speicher, 1wird als Zeiger interpretiert.

Marinus
quelle
5

Cython, 14

Dies ist häufig für Debugging-Zwecke nützlich.

a=(<int*>0)[0]
boothby
quelle
5

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.)

inc(r0)

Inkrementiert das einzelne Byte, das durch den Anfangswert von r0 adressiert wird [der laut simh-Debugger zufällig 05162 ist], ab Programmstart.

0000000 000407 000002 000000 000000 000000 000000 000000 000000
0000020 005210 000000

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.

Random832
quelle
5

Matlab - Ja, das ist möglich!

In einer Antwort auf eine Frage von mir kam Amro mit dieser Eigenart:

S = struct();
S = setfield(S, {}, 'g', {}, 0)
Dennis Jaheruddin
quelle
Bitte geben Sie Matlab-Version an - R2015B (und 2016B auch) löst nur einen Fehler aus: Fehler bei der Verwendung von setfield (Zeile 56) Mindestens ein Index ist erforderlich.
Florian Castellane
@FlorianCastellane Nicht in der Lage, alle Versionen jetzt zu testen, aber es wurde bestätigt, dass es in einigen Versionen einen Segfault gibt, der neueste ist 2014b und der früheste 2012a.
Dennis Jaheruddin
5

JavaScript-Shell, 7 Byte

clear()

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

Downgoat
quelle
Laut MDN (document.clear) sollte dies nur in wirklich alten Versionen von Mozilla funktionieren, und selbst dann, was ist Ihrer Erfahrung nach wirklich fehlerhaft?
Tomsmeding
@tomsmeding das ist window.clear, FF verrät es nicht direkt, es ist ein eingebauter
Spidermonkey
5

Pyth, 3 Zeichen

j1Z

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.

Erläuterung

jquadriert 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.

- Dennis ♦

NO_BOOT_DEVICE
quelle
Hab was rausgefunden! Pyth der Quelle zum Surfen, fand ich , dass dieser Code tut jauf 1und 0, die versucht , konvertieren 1in der Basis 0. Warum das so ist, weiß ich nicht ...
NoOneIsHere
1
Sehen Sie hier . jquadriert 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.
Dennis
@ Tennis IDEone
NoOneIsHere
@SeeRhino Der Pyth-Interpreter setzt das Rekursionslimit auf 100.000. Zumindest bei TIO reicht das für einen Segfault.
Dennis