Kürzester Code, der einen SIGSEGV

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

Kommentare

  • Wow. Möglicherweise die kürzeste erfolgreiche Frage.
  • @MatthewRoh Aus Interesse habe ich diese SEDE-Abfrage gestellt. Es sieht so aus, als gäbe es einige mit +10 oder höher, aber dies ist die erste über +40

Antwort

C, 5 Zeichen

main; 

Es ist eine Variablendeklaration – int Typ ist impliziert (Feature kopiert von B-Sprache) und 0 ist der Standardwert. Bei der Ausführung wird versucht, eine Zahl auszuführen (Zahlen sind nicht ausführbar), und es wird SIGSEGV verursacht

Probieren Sie es online aus!

Kommentare

  • @Macmade: Eigentlich ist es 0. static Variablen beginnen als 0 und main; ist static, wie ich es außerhalb der Funktion deklariert habe. c-faq.com/decl/initval.html
  • Als ich das letzte Mal mit diesem Ding gespielt habe, habe ich herausgefunden, dass es ‚ ist ein anderer Grund für den Segfault. Wenn Sie main aufrufen, springen Sie zunächst zur Position von main und nicht zum Wert. Eine andere Sache ist, dass main ein int ist, es ‚ s befindet sich in .bss, normalerweise befinden sich Funktionen in .text, wenn der Kernel das elf-Programm lädt, erstellt er eine ausführbare Seite für .text und nicht ausführbar für .bss Wenn Sie also main aufrufen, springen Sie zu einer nicht ausführbaren Seite, und die Ausführung auf einer solchen Seite ist a Schutzfehler.
  • Ja, Segfaults in C sind so ziemlich die Standardeinstellung: P
  • main __attribute__((section(".text#")))=0xc3; FTFY (zumindest scheint es ohne zurückzukehren Absturz auf meinem x86).
  • @jozxyqk Oder kürzer, const main=195;. So interessant es ist, dass es funktioniert ‚, das Ziel dieser Code-Golf-Herausforderung war es, den Code segfault zu machen, nicht zu funktionieren :).

Antwort

Bash, 11            

kill -11 $$ 

Kommentare

  • Signal 11 in 11 Zeichen. Scheint echt zu sein.
  • @ nyuszika7h Ich wollte Ihren Kommentar positiv bewerten, aber Sie haben momentan 11 positive Stimmen, also werde ich ‚ es dabei belassen. : P
  • @AlexL. andere Leute scheinen das verdorben zu haben 🙁
  • @theonlygusti Ja … Das ‚ ist schade .: (Na ja, dann kann ich es jetzt positiv bewerten .
  • Bis zu 42 Upvotes, kein Touchee!

Antwort

Assembly (Linux , x86-64), 1 Byte

RET 

Dieser Code ist fehlerhaft.

Kommentare

  • Als MSDOS .com-Datei wird sie fehlerfrei ausgeführt und beendet.
  • Mein Punkt ist: Nur die Angabe von „Assembly“ reicht nicht aus, um ‚ zu sein Machen Sie es segfault.
  • @JB: Unter MS DOS wird kein Programm jemals einen Segmentierungsfehler erzeugen. Dieser ‚ s, weil MS DOS im Real-Modus ausgeführt wird, in dem kein Speicherschutz vorhanden ist.
  • @celtschk IIRC NTVDM erkennt nicht vorhandene Adressen und solche, die nicht MS-DOS zugewiesen sind.
  • @celtschk: Sie können es trotzdem wie folgt segfault: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] – > CPU erhöhen s das zugrunde liegende SEGV (AFAIK dort ‚ ist niemand, der damit umgehen kann).

Antwort

Python 2, 13

exec"()"*7**6 

Windows meldet einen Fehlercode von c00000fd (Stapelüberlauf), von dem ich annehmen würde, dass er ein Subtyp von ist Segmentierungsfehler.

Dank Alex A. und Mego wurde bestätigt, dass Segmentierungsfehler auch auf Mac- und Linux-Systemen auftreten. Python ist die Sprache der Wahl, um Ihre Programme portabel zum Absturz zu bringen.

Kommentare

  • Segmentation fault: 11 auf Mac
  • Segmentation fault (core dumped) unter Linux
  • Hängt dies zuerst auf?
  • @MegaMan Wie in dauert es lange, bis der Vorgang abgeschlossen ist ? Nein, 7 ** 6 ist nur ungefähr 100 KB groß, daher gibt es ‚ keine wahrnehmbare Verzögerung.
  • @MaxGasner Versuchen Sie erneut, die Programmiersprache zu lesen 🙂

Antwort

pdfTeX ( 51)

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

Dies ist wahrscheinlich ein Fehler , der jedoch nicht vorhanden ist Das von Knuth geschriebene Original-TeX: Das Kompilieren des Codes mit tex filename.tex anstelle von pdftex filename.tex erzeugt keinen Segfault.

Antwort

LOLCODE, 4 Byte

OBTW 

Funktioniert nicht nur online im C-Interpreter.

Kommentare

  • LOL FANCY CODE M8 8/8 KTHXBYE

Antwort

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 n Ich teste auf:

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 oben Genannte ist selektiver Missbrauch …

Antwort

Weiter – 3 Zeichen

0 @ 

(@ ist ein Abruf)

Kommentare

  • Der bisher kürzeste, der auf modernen Systemen funktioniert.
  • Welcher weiter? Gforth sagt nur “ Ungültige Speicheradresse “

Antwort

W32 .com ausführbar – 0 Byte

Dies scheint seltsam, aber auf 32-Bit-Windows-Systemen kann das Erstellen und Ausführen einer leeren .com-Datei verursacht einen Segfault, abhängig von … etwas. DOS akzeptiert es nur (der 8086 hat keine Speicherverwaltung, es gibt keine aussagekräftigen Segmente, die fehlerhaft sind), und 64-Bit-Windows weigert sich, es auszuführen (x86-64 hat keinen v86-Modus zum Ausführen einer .com-Datei).

Antwort

C, 18

main(){raise(11);} 

Kommentare

  • Müssen Sie #include < signal.h > in die Codeliste aufnehmen?
  • @FlorianCastellane: In C90 und niedriger deklariert der Compiler für jeden Funktionsaufruf ohne sichtbare Deklaration implizit int func(). d.h. eine Funktion, die int zurückgibt und nicht spezifizierte Parameter verwendet. In diesem Fall ist raise eine Funktion, die int zurückgibt und ein int-Argument verwendet. Dies funktioniert also (auch wenn sich der Compiler beschwert).
  • @Hasturkun main(){main();}

Antwort

Perl (< 5.14), 9 Zeichen

/(?{??})/ 

In 5.14 wurde die Regex-Engine wiedereintrittsfähig gemacht, damit sie auf diese Weise nicht abstürzen konnte, sondern 5.12 und früher wird segfault, wenn Sie dies versuchen.

Kommentare

  • Ich kann dies auf Perl 5.14 (Debian) und 5.18 (Arch Linux) reproduzieren. sprunge.us/RKHT
  • Wiedergabe mit Perl v5.20.2 (Windows)
  • Was ist mit /(?R)/ bei älteren Perl-Versionen?

Antwort

brainfuck (2)

<. 

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

Kommentare

  • Wie ist ein Compiler, der auf diesem “ gut „? Das < sollte entweder keine Auswirkung haben oder umlaufen.
  • Es ist am besten, sofort einen Laufzeitfehler bei Grenzverletzungen zu erzeugen, da der Programmierer den Fehler als finden und beheben kann schnell wie möglich. Wenn Sie das fehlerhafte Programm eine Weile laufen lassen und den Speicher vor dem Absturz zufällig beschädigen, ist das Problem nur schwerer zu diagnostizieren. Wie Sie vorschlagen, 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 Standard-Compilern und -Dolmetschern abstürzt.
  • mgekehrt ist das Abfangen von Grenzverletzungen vor der Laufzeit im Allgemeinen nicht möglich und in den Fällen, in denen dies möglich ist, 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 ‚ keine Geschwindigkeitskosten verursacht. (Falls ‚ nicht klar ist, führt der Compiler selbst ‚ keinen Segfault aus – er erzeugt ausführbare Dateien, die beim Versuch einen Segfault verursachen Zugriff auf Speicher außerhalb der Grenzen.)

  • Können Sie eine Implementierung bereitstellen, die dieses Verhalten erzeugt und erstellt wurde, bevor diese Herausforderung veröffentlicht wurde? Wenn nicht, ist diese Antwort ungültig.
  • Grenzüberprüfungen sind implementierungsspezifisch, daher bin ich ‚ sicher, dass einige Fehler auftreten würden.Würde irgendein SIGSEGV aber? Ich bezweifle das. Es gibt jedoch eine große Anzahl von Programmen, die vom Array-Wrapping auf der linken Seite abhängen. Es kann sehr praktisch sein, auf beiden Seiten einen wachsenden Speicher zu haben.

Antwort

Haskell, 31

foreign import ccall main::IO() 

Dies führt zu einem Segfault, wenn es mit GHC kompiliert und ausgeführt wird. Es sind keine Erweiterungsflags erforderlich, da die Fremdfunktionsschnittstelle im Haskell 2010-Standard enthalten ist.

Kommentare

  • Awwww. Ich wollte import Foreign;main=peek nullPtr::IO Int posten, aber diese ‚ s 40.

Antwort

Bash, 4 Bytes

Golf

 . $0  

Fügen Sie das Skript rekursiv in sich selbst ein.

Erklärt

Rekursive “ Quelle “ (.) -Operation verursacht schließlich einen Stapelüberlauf und da Bash nicht in libsigsegv integriert ist Dies führt zu einer SIGSEGV.

Beachten Sie, dass dies kein Fehler ist, sondern ein erwartetes Verhalten, wie hier beschrieben.

Test

 ./bang Segmentation fault (core dumped)  

Probieren Sie es online aus!

Antwort

Python 33

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

Sende Signal 11 (SIGSEGV) in Python.

Kommentare

  • Auch 33 Zeichen: from os import* und kill(getpid(),11)

Antwort

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

Die C-Version lautet:

*(int*)0=0; 

Das gesamte Programm (nicht ganz ISO) -konform, nehmen wir an, es ist K & RC) ist 19 Zeichen lang:

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

Assembler Variante:

orl $0,0 

Das gesamte Programm ist 24 Zeichen lang (nur zur Auswertung, da es eigentlich kein Assembler ist):

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

EDIT :

Einige C-Varianten. Die erste verwendet die Nullinitialisierung der globalen Zeigervariablen:

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

Die zweite 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 alle oben genannten – 6 (14) Zeichen. Es wird davon ausgegangen, dass Literalzeichenfolgen in ein schreibgeschütztes Segment eingefügt werden.

main(){*""=0;} 

EDIT 3 :

Und mein letzter Versuch – 1 Zeichen lang:

P 

Kompilieren Sie es einfach so :

cc -o segv -DP="main(){main();}" segv.c 

Kommentare

  • in C isn ‚ t main; nur 5 Zeichen
  • : Linker ‚ prüft nicht, ob main funktioniert oder nicht. Es wird nur an übergeben Der Loader und die Rückgabe sigsegv
  • @FUZxxl In diesem Fall ist main eine nullinitialisierte globale int-Variable ein Ergebnis des Versuchs, einige Null-Bytes auszuführen. In x86 ist ‚ so etwas wie add %al,(%rax), eine vollkommen gültige Anweisung, die versucht, den Speicher an der in %rax. Die Chancen, dort eine gute Adresse zu haben, sind minimal.
  • Natürlich kann der letzte Eintrag für alles verwendet werden, Sie müssen nur die richtigen Compiler-Argumente angeben. Das sollte es zum automatischen Gewinner eines Code-Golf-Wettbewerbs machen. 🙂
  • Normalerweise werden andere Compiler-Flags als diejenigen, die die zu verwendende Sprachversion auswählen, auf die Gesamtsumme angerechnet.

Antwort

Perl, 10/12 Zeichen

Eine leicht betrügerische Lösung besteht darin, ein Zeichen zu entfernen. Joey Adams „Bash-Trick :

kill 11,$$ 

Um jedoch einen echten Segfault in Perl zu erhalten, ist unpack p die offensichtliche Lösung :

unpack p,1x8 

Technisch gesehen ist dies nicht garantiert, da die Adresse 0x31313131 (oder 0x313131313131313131 auf 64-Bit-Systemen) könnte zufällig auf einen gültigen Adressraum verweisen. Aber die Chancen stehen dagegen. Wenn Perl jemals auf Plattformen portiert wird, auf denen Zeiger länger als 64 Bit sind, muss die x8 erhöht werden.

Kommentare

  • Was ist das 1x8?
  • @HannesKarppila ‚ ist eine kurze Möglichkeit, "11111111".

Antwort

dc – 7 Zeichen

[dx0]dx 

verursacht einen Stapelüberlauf

Kommentare

  • Funktioniert, aber können Sie näher darauf eingehen? Warum verhält es sich so?
  • [dx0] speichert dx0 auf dem Stapel und dann d dupliziert das oberste Stapelelement, dann x öffnet das oberste Stapelelement (dx0) und führt es aus. Dadurch wird das oberste Stapelelement dupliziert und mit der Ausführung begonnen … Die 0 muss vorhanden sein, um zu verhindern, dass dies ein Tail-Aufruf ist, sodass sich alle aufbauen.

Antwort

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 durchaus als „Skalpell“ bezeichnet werden of Programming „: Scharf, genau, klein und leicht, aber auch gefährlich in der Hand von Unerfahrenen.

Antwort

F90 – 39 Byte

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

Kompilierung:

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 

Kommentare

  • Schöner erster Beitrag.

Antwort

Eigentlich , 17 16 11 10 9 Bytes

⌠[]+⌡9!*. 

Probieren Sie es online aus!

Wenn das oben genannte nicht abstürzt, erhöhen Sie die Zahl (mehrstellige Zahlen sind in Tatsächlich mit einem führenden Doppelpunkt angegeben )

Stürzt den Interpreten ab r durch Ausnutzen von eines Fehlers in Python mit tief verschachtelten itertools.chain -Objekten, der tatsächlich zur Implementierung der + Operator.

Antwort

OCaml, 13 Bytes

Obj.magic 0 0 

Dies verwendet die Funktion Obj.magic, die zwei beliebige Typen unsicher erzwingt. In diesem Fall wird 0 (aufgrund des vom GC verwendeten Tag-Bits als unmittelbarer Wert 1 gespeichert) zu einem Funktionstyp (als Zeiger gespeichert) gezwungen. Daher wird versucht, die Adresse 1 zu dereferenzieren, und dies führt natürlich zu einem Segfault.

Kommentare

  • it coerces 0 (stored as the immediate value 1) – warum wird 0 als 1 gespeichert?
  • @Skyler siehe bearbeiten
  • Obj.magic()0 ist ein Zeichen kürzer 🙂

Antwort

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 jemand dies für mich erklären könnte, wäre ich dankbar.

Hier ist es in einem Online-Dolmetscher.

Erläuterung

j quadriert die Basis und ruft sich rekursiv auf, bis die Basis mindestens so groß wie die Zahl ist. Da die Basis 0 ist, ist das passiert nie. Bei einer ausreichend hohen Rekursionsgrenze erhalten Sie einen Segfault.

Dennis ♦

Kommentare

  • Beim Durchsuchen der Quelle von Pyth ‚ habe ich festgestellt, dass dieser Code j auf 1 und 0, die versuchen , 1 in base 0 Warum das so ist, habe ich nicht Idee …
  • Siehe hier . j quadriert die Basis und ruft sich rekursiv auf, bis die Basis mindestens so groß wie die Zahl ist. Da die Basis 0 ist, passiert das nie. Mit einer ausreichend hohen Rekursionsgrenze erhalten Sie einen Segfault.
  • @Dennis IDEone
  • @SeeRhino Der Pyth-Interpreter setzt das Rekursionslimit auf 100.000. Zumindest unter TIO reicht diese ‚ für einen Segfault aus.

Antwort

C # – 62

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

C # / unsicher, 23 Byte

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

Aus irgendeinem Grund verstehe ich nicht, dass *(int*)0=0 nur eine NullReferenceException auslöst, während diese Version die richtige Zugriffsverletzung darstellt.

Kommentare

  • Die int i=*(int*)0; gibt eine NullReferenceException für mich zurück.
  • Sie können versuchen, auf einen negativen Speicherort wie *(int*)-1=0 zuzugreifen und eine Zugriffsverletzung zu erhalten.
  • Die besondere Ausnahme ist genau das, was der clr wickelt es ein und ist unbedeutend. Das Betriebssystem selbst gibt in all diesen Fällen tatsächlich den Seg-Fehler aus.
  • Der Grund, warum *(int*)0=0 eine Ausnahme auslöst, ist wahrscheinlich auf die Optimierung zurückzuführen. Um die Kosten für die Überprüfung auf null zu vermeiden, entfernt das Optimierungsprogramm möglicherweise Nullprüfungen. Wenn jedoch ein Segfault auftritt, wird es möglicherweise als ordnungsgemäße NullReferenceException.

Antwort

19 Zeichen in C

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

Der Wert der Rücksprungadresse der Hauptfunktion wird beschädigt, sodass bei der Rückgabe von main ein SIGSEGV angezeigt wird.

Kommentare

  • Dies hängt vom Stapelrahmenlayout ab, sodass es in einigen Architekturen möglicherweise nicht fehlschlagen kann.
  • Warum nicht einfach main; oder main(){*""=0;}?
  • @Sapphire_Brick main; ist bereits in einer anderen Antwort angegeben.
  • @saeedn Warum dann überhaupt posten? Dieser ist nicht ‚, nicht einmal der zweitbeste!
  • @Sapphire_Brick Zu der Zeit, als ich meinen veröffentlichte, main; wurde nicht ‚ nicht gepostet und ich wusste nicht ‚, dass es funktioniert. Ich habe nur darauf hingewiesen, dass es bereits gegeben ist und es keinen Sinn macht, meine Antwort zu ändern. Darüber hinaus posten die Leute hier ‚ nicht nur für den kürzesten, manchmal ist auch eine andere Art der Problemlösung interessant.

Antwort

Cython, 14

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

a=(<int*>0)[0] 

Antwort

J (6)

memf 1 

memf bedeutet freier Speicher, 1 wird als Zeiger interpretiert.

Kommentare

  • Warum 1 anstatt 0? Ist es legal, einen Nullzeiger in J freizugeben?

Antwort

Matlab – Ja, das ist möglich!

In einer Antwort auf eine meiner -Fragen kam Amro auf diese Eigenart:

S = struct(); S = setfield(S, {}, "g", {}, 0) 

Kommentare

  • Bitte geben Sie die Matlab-Version an – R2015B (und auch 2016B) gibt nur einen Fehler aus: Fehler bei Verwendung von setfield (Zeile 56) Mindestens einer Index ist erforderlich.
  • @FlorianCastellane Es können derzeit nicht alle Versionen getestet werden. Es wurde jedoch bestätigt, dass in einigen Versionen ein Segfault auftritt, zuletzt 2014b und frühestens 2012a.

Antwort

C – 14 Zeichen

Stellen Sie sicher, dass Sie eine leere Datei mit

Erläuterung:

Was schief gelaufen ist, ist, dass wir _start so behandelt haben, als wäre es eine C-Funktion. und versuchte, davon zurückzukehren. In Wirklichkeit ist es überhaupt keine Funktion. Es ist nur ein Symbol in der Objektdatei, mit dem der Linker den Einstiegspunkt des Programms findet. Wenn unser Programm aufgerufen wird, wird es direkt aufgerufen. Wenn wir schauen würden, würden wir sehen, dass der Wert oben auf dem Stapel die Nummer 1 war, was sicherlich sehr unadressartig ist. Was sich auf dem Stapel befindet, ist der argc-Wert unseres Programms. Danach folgen die Elemente des argv-Arrays, einschließlich des abschließenden NULL-Elements, gefolgt von den Elementen von envp. Und das ist alles. Es gibt keine Absenderadresse auf dem Stapel.

Kommentare

  • I ‚ Ich bin mir ziemlich sicher, dass Sie mit den zusätzlichen Argumenten punkten müssen.
  • Sie müssen 14 Bytes für das spezielle Flag hinzufügen.
  • @ErikGolfer エ リ ッ ク ゴ ル フ n n -nostartfiles is tatsächlich 13 Bytes lang 🙂
  • @CharlesPaulet Ich denke, Sie müssen auch den Speicherplatz zählen.

Antwort

Unix PDP-11-Assembly, 18 Bytes binär, 7 Bytes Quelle

(dies wird bei mir zu einem Thema, vielleicht weil es die einzige Sprache ist, die ich irgendwie kenne, dass nein- eine andere hier tut dies.)

inc(r0) 

Inkrementiert das einzelne Byte, das durch den Anfangswert von r0 [der laut simh-Debugger zufällig 05162 ist] adressiert wird 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 einem Streifen entfernt werden.

Ich habe einige gemacht Versuche, die Quelle kürzer zu machen, endeten aber immer ge entweder einen Syntaxfehler oder SIGBUS.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.