Codice più breve che genera un SIGSEGV


Risposte:


113

C, 5 caratteri

main;

È una dichiarazione variabile - il inttipo è implicito (funzione copiata dal linguaggio B) ed 0è un valore predefinito. Quando eseguito, tenta di eseguire un numero (i numeri non sono eseguibili) e causa SIGSEGV.

Provalo online!


5
@Macmade: in realtà lo è 0. staticle variabili iniziano come 0, ed main;è static, come l'ho dichiarato al di fuori della funzione. c-faq.com/decl/initval.html
Konrad Borowski il

16
l'ultima volta che ho giocato con questa cosa, ho capito che c'è un motivo diverso per il segfault. Prima di tutto chiamando main salti alla posizione di main, non al valore, un'altra cosa è mainun int, si trova in .bss, di solito le funzioni si trovano in .text, quando il kernel carica il programma elf crea una pagina eseguibile per .texte non eseguibile per .bss, quindi chiamando main, si passa a una pagina non eseguibile e l'esecuzione di qualcosa su tale pagina è un errore di protezione.
mniip,

23
Sì, i segfault in C sono praticamente i valori predefiniti: P
Paul Draper,

1
main __attribute__((section(".text#")))=0xc3;FTFY (almeno sembra tornare senza crash sul mio x86).
jozxyqk,

2
@jozxyqk o meno lunghi, const main=195;. Per quanto interessante sia il suo funzionamento, l'obiettivo di questa sfida di golf del codice era rendere il codice segfault, non funzionare :).
Konrad Borowski,

74

Bash, 11      

kill -11 $$

44
Segnale 11 in 11 caratteri. Sembra giusto.
nyuszika7h,

12
@ nyuszika7h Stavo per votare il tuo commento, ma hai 11 voti adesso, quindi lo lascerò a quello. : P
HyperNeutrino,

3
@AlexL. altre persone sembrano aver rovinato questo :(
theonlygusti il

2
@theonlygusti Sì ... È un peccato. :( Oh bene, allora posso votarlo adesso.
HyperNeutrino,

2
Fino a 42 voti, no touchee!
seadoggie01,

39

Assembly (Linux, x86-64), 1 byte

RET

Questo codice segfault.


7
Come file MSDOS .com, viene eseguito e termina senza errori.
JB,

10
Il mio punto è: specificare semplicemente "assembly" non è sufficiente per renderlo segfault.
JB,

53
@JB: su MS DOS, nessun programma produrrà mai un errore di segmentazione. Questo perché MS DOS viene eseguito in modalità reale in cui la protezione della memoria è inesistente.
Celtschk,

1
@celtschk IIRC NTVDM uscirà su indirizzi inesistenti e su quelli non assegnati a MS-DOS.
ζ--

2
@celtschk: Puoi comunque segfault in questo modo: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] -> La CPU aumenta il SEGV sottostante (AFAIK non c'è nessuno che possa gestirlo).
Joshua,

26

Python 2, 13

exec'()'*7**6

Windows riporta un codice di errore di c00000fd (StackTranslate.it) che suppongo sia un sottotipo di errore di segmentazione.

Grazie ad Alex A. e Mego, è confermato che causa errori di segmentazione anche su sistemi Mac e Linux. Python è la lingua preferita per bloccare in modo portabile i tuoi programmi.


7
Segmentation fault: 11su Mac
Alex A.

7
Segmentation fault (core dumped)su Linux
Mego

Questo si blocca per primo?
Mega Man,

1
@MegaMan Come impiegare molto tempo per finire? No, 7 ** 6 è solo circa 100K, quindi non c'è alcun ritardo percettibile.
feersum

Perché funziona? Non sembra su Python 3.6.8 su Mac OS.
Max Gasner,

22

pdfTeX (51)

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

Questo in realtà è probabilmente un bug , ma non è presente nel TeX originale, scritto da Knuth: compilare il codice con tex filename.texinvece di pdftex filename.texnon produce un segfault.



17

Python, 33 caratteri

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

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

Python, 60 caratteri

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

Fonte: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup

Questa è la versione di Python su cui sto testando:

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

In generale, l'interprete Python è difficile da bloccare, ma quanto sopra è l'abusività selettiva ...


16

Avanti - 3 personaggi

0 @

( @è un recupero)


1
Quello più corto finora che funzionerà su sistemi moderni.
Demi

2
Quale futuro? Gforth dice semplicemente "Indirizzo di memoria non valido"
cat

15

C, 18

main(){raise(11);}

devi aggiungere #include <signal.h> nell'elenco di codici?
Florian Castellane,

5
@FlorianCastellane: in C90 e inferiore, per qualsiasi chiamata di funzione eseguita senza una dichiarazione visibile, il compilatore lo dichiara implicitamente come int func(). cioè una funzione che ritorna int, prendendo parametri non specificati. In questo caso raiseè una funzione che restituisce int, prendendo un argomento int, quindi questo funziona (anche se il compilatore si lamenta).
Hasturkun,

14

Perl (<5.14), 9 caratteri

/(?{??})/

In 5.14 il motore regex è stato reso rientrante in modo da non poter essere arrestato in questo modo, ma 5.12 e versioni precedenti verranno segfault se provi questo.


Posso riprodurlo su Perl 5.14 (Debian) e 5.18 (Arch Linux). sprunge.us/RKHT
nyuszika7h

Riprodotto con Perl v5.20.2 (windows)
mehi

14

Eseguibile W32 .com - 0 byte

Sembrerà strano, ma su sistemi Windows a 32 bit, la creazione e l'esecuzione di un file .com vuoto possono causare un segfault, a seconda di ... qualcosa. DOS lo accetta (l'8086 non ha gestione della memoria, non ci sono segmenti significativi da criticare) e Windows a 64 bit rifiuta di eseguirlo (x86-64 non ha la modalità v86 per eseguire un file .com).


13

brainfuck (2)

<.

Sì, questo dipende dall'implementazione. SIGSEGV è il probabile risultato di un buon compilatore.


4
In che modo un compilatore che segfault su quel "buono"? Ciò non <dovrebbe avere alcun effetto o concludersi.
nyuszika7h

12
La produzione immediata di un errore di runtime sulla violazione dei limiti è la migliore perché consente al programmatore di trovare e correggere il bug il più rapidamente possibile. Lasciare il programma difettoso in esecuzione per un po 'e la memoria corrotta a casaccio prima dell'arresto anomalo rende il problema più difficile da diagnosticare. Prevenire completamente l'incidente, come suggerisci, è peggio; il programmatore può far "funzionare" il programma e quindi essere pubblicamente umiliato quando si arresta in modo anomalo su compilatori e interpreti standard.
Daniel Cristofani,

1
Al contrario, la rilevazione di violazioni dei limiti prima del runtime non è possibile in generale, né particolarmente utile nei casi in cui è possibile. Produrre un errore di runtime più descrittivo andrebbe bene, ma fare in modo che il sistema operativo lo catturi come segfault è ottimo perché non ha alcun costo di velocità. (Nel caso in cui non sia chiaro, il compilatore stesso non segfault - produce eseguibili che segfault non appena provano ad accedere alla memoria senza limiti.)
Daniel Cristofani,

4
Potete fornire un'implementazione che produce questo comportamento ed è stata creata prima che questa sfida fosse pubblicata? In caso contrario, questa risposta non è valida.
Mego

1
I controlli dei limiti sono specifici per l'implementazione, quindi sono sicuro che ci sono alcuni errori. Sarebbe qualche SIGSEGV però? Ne dubito. Esistono molti programmi che dipendono dall'array che si sposta a sinistra. Può essere piuttosto conveniente avere spazio di archiviazione coltivabile su entrambi i lati.
captncraig,

12

Haskell, 31

foreign import ccall main::IO()

Questo produce un segfault quando compilato con GHC ed eseguito. Non sono necessari flag di estensione, poiché l'interfaccia di funzione esterna è nello standard Haskell 2010.


10

C - 11 (19) 7 (15) 6 (14) 1 carattere, assemblatore AT&T x86 - 8 (24) caratteri

La versione C è:

*(int*)0=0;

L'intero programma (non abbastanza conforme all'ISO, supponiamo che sia K&R C) è lungo 19 caratteri:

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

Variante assemblatore:

orl $0,0

L'intero programma è lungo 24 caratteri (solo per valutazione, dal momento che in realtà non è assemblatore):

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

MODIFICA :

Un paio di varianti C. Il primo utilizza l'inizializzazione zero della variabile puntatore globale:

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

Il secondo utilizza una ricorsione infinita:

main(){main();}

L'ultima variante è la più breve - 7 (15) caratteri.

EDIT 2 :

Ha inventato una variante in più che è più corta di qualsiasi di sopra - 6 (14) caratteri. Presuppone che le stringhe letterali vengano inserite in un segmento di sola lettura.

main(){*""=0;}

EDIT 3 :

E il mio ultimo tentativo - 1 carattere lungo:

P

Compilalo così:

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

3
in C non è principale; solo 5 personaggi
Arya il

1
: Linker non controlla se main è funzionante o meno, ma semplicemente lo passa al caricatore e restituisce sigsegv
Arya,

1
@FUZxxl In questo caso mainè una variabile int globale inizializzata con zero, quindi quello che otteniamo è il risultato del tentativo di eseguire alcuni byte zero. In x86 sarebbe qualcosa del genere add %al,(%rax)che è un'istruzione perfettamente valida che cerca di raggiungere la memoria all'indirizzo memorizzato %rax. Le probabilità di avere un buon indirizzo sono minime.
Alexander Bakulin,

6
Ovviamente l'ultima voce può essere utilizzata per tutto, devi solo fornire gli argomenti del compilatore giusti. Che dovrebbe renderlo il vincitore automatico di qualsiasi gara di golf di codice. :-)
celtschk

5
Di solito i flag del compilatore diversi da quelli che scelgono la versione della lingua da utilizzare vengono conteggiati per il totale.
Jerry Jeremiah,

9

dc - 7 caratteri

[dx0]dx

provoca un overflow dello stack


Funziona, ma puoi elaborarlo? Perché si comporta in questo modo?
Stéphane Gourichon,

2
[dx0]memorizza dx0sullo stack, quindi dduplica l'elemento stack superiore, quindi xfa apparire l'elemento stack superiore ( dx0) ed esegue. Il che duplica l'elemento superiore dello stack e inizia a eseguirlo ... 0deve essere lì per evitare che si tratti di una chiamata in coda, quindi si accumulano tutti.
Ben Millwood,

8

Perl, 10/12 caratteri

Una soluzione leggermente imbarazzante è quella di radere un personaggio dal trucco bash di Joey Adams :

kill 11,$$

Tuttavia, per ottenere un vero segfault in Perl, unpack pè la soluzione ovvia:

unpack p,1x8

Tecnicamente, questo non è garantito per segfault, poiché l'indirizzo 0x31313131 (o 0x313131313131313131 su sistemi a 64 bit) potrebbe indicare uno spazio di indirizzi valido per caso. Ma le probabilità sono contro di esso. Inoltre, se il perl viene mai portato su piattaforme in cui i puntatori sono più lunghi di 64 bit, x8sarà necessario aumentare.


1
Cos'è questa 1x8cosa?
Hannes Karppila,

@HannesKarppila È un modo breve per scrivere"11111111".
Ilmari Karonen,

8

Python 33

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

Invio del segnale 11 (SIGSEGV) in pitone.


2
Anche 33 personaggi: from os import*ekill(getpid(),11)
Timtech

8

OCaml, 13 byte

Obj.magic 0 0

Questo utilizza la funzione Obj.magic, che costringe in modo non sicuro due tipi qualsiasi. In questo caso, costringe 0 (memorizzato come valore immediato 1, a causa del bit di tag utilizzato dal GC) a un tipo di funzione (memorizzato come puntatore). Quindi, cerca di dereferenziare l'indirizzo 1, e questo ovviamente segfault.


1
it coerces 0 (stored as the immediate value 1)- perché 0 è memorizzato come 1?
Skyler,

1
@Skyler vedi modifica
Demi

1
Obj.magic()0è un carattere più corto :)
Ben Millwood,

8

Bash, 4 byte

golfed

. $0

Includere ricorsivamente lo script in se stesso.

spiegato

L'operazione "source" (.) Ricorsiva provoca eventualmente uno overflow dello stack e poiché Bash non si integra con libsigsegv , ciò si traduce in un SIGSEGV.

Si noti che questo non è un bug, ma un comportamento previsto, come discusso qui .

Test

./bang 
Segmentation fault (core dumped)

Provalo online!


8

In realtà , 17 16 11 10 9 byte

⌠[]+⌡9!*.

Provalo online!

Se quanto sopra non va in crash, prova ad aumentare il numero (i numeri a più cifre sono specificati in In realtà con due punti iniziali)

Arresta in modo anomalo l'interprete sfruttando un bug in Python che coinvolge itertools.chainoggetti profondamente nidificati , che in realtà utilizza per implementare l' +operatore.


7

C # - 62

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

Modifica: 23

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

Devi compilare con / non sicuro per far funzionare questo. Per qualche motivo non capisco, *(int*)0=0genera solo NullReferenceException, mentre questa versione fornisce la violazione di accesso corretta.


I int i=*(int*)0;rendimenti di un NullReferenceException per me.
Peter Olson,

Puoi provare ad accedere a una posizione negativa, ad esempio *(int*)-1=0e ottenere una violazione di accesso.
Peter Olson,

L'eccezione particolare è proprio ciò in cui il clr lo avvolge ed è insignificante. Il sistema operativo stesso in realtà fornisce l'errore seg in tutti questi casi.
captncraig,

Il motivo per cui *(int*)0=0genera un'eccezione è probabilmente dovuto all'ottimizzazione. In particolare, per evitare il costo del controllo null, l'ottimizzatore può rimuovere i controlli nulli, ma quando si verifica un segfault può ripeterlo come corretto NullReferenceException.
Konrad Borowski,

7

PicoLisp - 4 caratteri

$ pil
: ('0)
Segmentation fault

Questo è un comportamento previsto. Come descritto sul loro sito Web:

Se alcuni linguaggi di programmazione dichiarano di essere il "coltellino svizzero della programmazione", allora PicoLisp potrebbe essere definito il "bisturi della programmazione": nitido, preciso, piccolo e leggero, ma anche pericoloso nella mano di chi non ha esperienza.


7

F90 - 39 byte

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

Compilazione:

gfortran segv.f90 -o segv 

Esecuzione:

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

materiali:

gfortran --version
GNU Fortran (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4

1
Bel primo post.
Rɪᴋᴇʀ

6

19 caratteri in C.

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

Corrompe il valore dell'indirizzo di ritorno della funzione principale, quindi ottiene un SIGSEGV al ritorno di main.


Dipende dal layout del frame dello stack, quindi in alcune architetture non può fallire.
Alexander Bakulin,

6

J (6)

memf 1

memfsignifica memoria libera, 1viene interpretato come un puntatore.


5

Cython, 14

Questo spesso è utile per scopi di debug.

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

5

Assembly Unix PDP-11, binario 18 byte, sorgente 7 byte

(questo sta diventando un tema per me, forse perché è l'unica lingua che conosco che nessun altro qui fa.)

inc(r0)

Incrementa il singolo byte indirizzato dal valore iniziale di r0 [che risulta essere 05162 secondo il debugger simh] all'inizio del programma.

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

E, come sempre, i byte estranei alla fine possono essere rimossi con strip.

Ho fatto alcuni tentativi per accorciare l'origine, ma alla fine ho sempre avuto un errore di sintassi o SIGBUS.


5

Matlab - Sì, è possibile!

In risposta a una mia domanda , Amro ha inventato questa stranezza:

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

Fornisci la versione di Matlab - R2015B (e anche 2016B) genera solo un errore: Errore nell'utilizzo di setfield (riga 56) È richiesto almeno un indice.
Florian Castellane,

@FlorianCastellane Non sono in grado di provare tutte le versioni ora, ma è stato confermato di dare un segfault in alcune versioni, l'ultima è il 2014b e la prima 2012a.
Dennis Jaheruddin,

5

Shell JavaScript, 7 byte

clear()

Cancella assolutamente tutto, non solo l'ambito attuale che ovviamente causa molti borks che provocano l'esplosione e la segfault di JS


Secondo MDN (document.clear), questo dovrebbe fare qualcosa solo nelle versioni davvero vecchie di Mozilla, e anche allora, cosa segfault davvero nella tua esperienza?
tomsmeding,

@tomsmeding questo è window.clear, FF non lo rivela direttamente, è un tasto integrato incorporato
Downgoat

5

Pyth, 3 personaggi

j1Z

Questa sarebbe la parte in cui spiego come ho trovato questa risposta, a meno che non abbia legittimamente idea . Se qualcuno potesse spiegarmelo, sarei grato.

Eccolo in un interprete online.

Spiegazione

jquadra la base e si chiama ricorsivamente fino a quando la base è grande almeno quanto il numero. Poiché la base è 0 , ciò non accade mai. Con un limite di ricorsione sufficientemente elevato, si ottiene un segfault.

- Dennis ♦


Ho capito qualcosa! Sfogliando la fonte di Pyth, ho scoperto che questo codice funziona jsu 1e 0, che tenta di convertire 1in base 0. Perché questo segfault, non ne ho idea ...
NoOneIsHere

1
Vedi qui . jquadra la base e si chiama ricorsivamente fino a quando la base è grande almeno quanto il numero. Poiché la base è 0 , ciò non accade mai. Con un limite di ricorsione sufficientemente elevato, si ottiene un segfault.
Dennis,

@Dennis IDEone
NoOneIsHere

@SeeRhino L'interprete Pyth imposta il limite di ricorsione su 100.000. Almeno su TIO, è abbastanza per un segfault.
Dennis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.