Scrivi il codice più breve che solleva un errore di segmentazione (SIGSEGV) in qualsiasi linguaggio di programmazione.
Commenti
- Wow. Forse la domanda più breve riuscita.
- @MatthewRoh Per interesse, ho fatto questa query SEDE. Sembra che ce ne siano alcuni con +10 o superiore, ma questo è il primo sopra +40
Risposta
C, 5 caratteri
main;
È “una dichiarazione di variabile – int
il tipo è implicito (caratteristica copiata da Lingua B) e 0
è il valore predefinito. Quando viene eseguito, tenta di eseguire un numero (i numeri non sono eseguibili) e causa SIGSEGV
.
Commenti
- @Macmade: in realtà è
0
. Le variabilistatic
iniziano come0
emain;
èstatic
, come lho dichiarato al di fuori della funzione. c-faq.com/decl/initval.html - lultima volta che ho giocato con questa cosa, ho capito che ‘ un motivo diverso per il segfault. Prima di tutto chiamando main si passa alla posizione di main, non al valore, unaltra cosa è
main
è un int, è ‘ s si trovano in.bss
, di solito le funzioni si trovano in.text
, quando il kernel carica il programma elf crea una pagina eseguibile per.text
e non eseguibile per.bss
, quindi chiamando main, salti a una pagina non eseguibile ed eseguire qualcosa su tale pagina è un difetto di protezione. - Sì, i segfault in C sono praticamente limpostazione predefinita: P
-
main __attribute__((section(".text#")))=0xc3;
FTFY (almeno sembra tornare senza crash sul mio x86). - @jozxyqk O più breve,
const main=195;
. Altrettanto interessante è che ‘ sta funzionando, lobiettivo di questa sfida del golf di codice era rendere il codice segfault, non funzionare :).
Risposta
Bash, 11
kill -11 $$
Commenti
- Segnale 11 in 11 caratteri. Sembra legittimo.
- @ nyuszika7h Stavo per votare il tuo commento, ma hai 11 voti positivi in questo momento, quindi ‘ lascerò le cose così. : P
- @AlexL. altre persone sembrano averlo rovinato 🙁
- @theonlygusti Yeah … That ‘ è un peccato. 🙁 Oh beh, allora posso votare a favore .
- Fino a 42 voti positivi, niente touchee!
Risposta
Assembly (Linux , x86-64), 1 byte
RET
Questo codice esegue il segfault.
Commenti
- In quanto file MSDOS .com, viene eseguito e termina senza errori.
- Il punto è: specificare solo “assembly” non è ‘ abbastanza per rendilo segfault.
- @JB: su MS DOS, nessun programma mai produrrà un errore di segmentazione. Questo ‘ perché MS DOS viene eseguito in modalità reale in cui la protezione della memoria è inesistente.
- @celtschk IIRC NTVDM verrà eseguito su indirizzi inesistenti e su quelli non allocati a MS-DOS.
- @celtschk: puoi comunque impostarlo come segfault in questo modo: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] – > aumento della CPU è il SEGV sottostante (AFAIK non cè ‘ nessuno a gestirlo però).
Risposta
Python 2, 13
exec"()"*7**6
Windows segnala un codice di errore di c00000fd (Stack Overflow) che presumo sia un sottotipo di errore di segmentazione.
Grazie ad Alex A. e Mego, si conferma che causa errori di segmentazione anche su sistemi Mac e Linux. Python è il linguaggio scelto per bloccare in modo portabile i tuoi programmi.
Commenti
-
Segmentation fault: 11
su Mac -
Segmentation fault (core dumped)
su Linux - Riaggancia prima?
- @MegaMan Come in richiede molto tempo per finire ? No, 7 ** 6 è solo di circa 100 K quindi ‘ non presenta ritardi percettibili.
- @MaxGasner Prova a leggere di nuovo il linguaggio di programmazione 🙂
Rispondi
pdfTeX ( 51)
\def~#1{\meaning}\write0{\expandafter~\string}\bye
Questo in realtà è probabilmente un bug , ma non è presente in il TeX originale, scritto da Knuth: compilare il codice con tex filename.tex
invece di pdftex filename.tex
non produce un segfault.
Risposta
LOLCODE, 4 byte
OBTW
Non funziona solo online nellinterprete C.
Commenti
- LOL FANCY CODE M8 8/8 KTHXBYE
Risposta
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 Python n Sto provando su:
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] on darwin
In generale linterprete Python è difficile da bloccare, ma quanto sopra è abuso selettivo …
Risposta
Avanti – 3 caratteri
0 @
(@
è un recupero)
Commenti
- Il più breve finora che funzionerà sui sistemi moderni.
- Quale via? Gforth dice solo ” Indirizzo di memoria non valido ”
Risposta
W32 .com eseguibile – 0 byte
Sembrerà strano, ma su sistemi Windows a 32 bit, la creazione e lesecuzione di un file .com vuoto può causa un segfault, a seconda di … qualcosa. DOS lo accetta semplicemente (l8086 non ha la gestione della memoria, non ci sono segmenti significativi da criticare) e Windows a 64 bit si rifiuta di eseguirlo (x86-64 non ha la modalità v86 per eseguire un file .com).
Risposta
C, 18
main(){raise(11);}
Commenti
- devi aggiungere #include < signal.h > nellelenco del codice?
- @FlorianCastellane: in C90 e versioni precedenti, per qualsiasi chiamata di funzione eseguita senza una dichiarazione visibile, il compilatore la dichiara implicitamente come
int func()
. cioè una funzione che restituisceint
, che accetta parametri non specificati. In questo casoraise
è una funzione che restituisce int, che accetta un argomento int, quindi funziona (anche se il compilatore si lamenta). - @Hasturkun
main(){main();}
Risposta
Perl (< 5.14), 9 caratteri
/(?{??})/
Nella 5.14 il motore regex è stato reso rientrante in modo che non potesse essere bloccato in questo modo, ma 5.12 e se si prova in precedenza, verrà eseguito il segfault.
Commenti
- Posso riprodurlo su Perl 5.14 (Debian) e 5.18 (Arch Linux). sprunge.us/RKHT
- Riprodotto con Perl v5.20.2 (windows)
- Che dire di
/(?R)/
su versioni Perl precedenti?
Rispondi
brainfuck (2)
<.
Sì, dipende dallimplementazione. SIGSEGV è il probabile risultato di un buon compilatore.
Commenti
- Comè un compilatore che esegue il segfault su questo ” buono “? Questo
<
non dovrebbe avere alcun effetto o andarsene. - È meglio produrre immediatamente un errore di runtime sulla violazione dei limiti perché consente al programmatore di trovare e correggere il bug come il più velocemente possibile. Lasciare che il programma difettoso venga eseguito per un po e la memoria corrotta a casaccio prima di bloccarsi rende il problema più difficile da diagnosticare. Prevenire completamente il crash, come suggerisci, è la cosa peggiore; il programmatore può far funzionare il programma ” ” e poi essere umiliato pubblicamente quando si blocca su compilatori e interpreti standard.
- Al contrario, rilevare le 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 avere il sistema operativo che lo rileva come segfault è ottimo perché ‘ non ha alcun costo in termini di velocità. (Nel caso in cui ‘ non sia chiaro, il compilatore stesso non ‘ segfault – produce eseguibili che eseguono il segfault non appena provano per accedere alla memoria fuori dai limiti.)
- Potete fornire unimplementazione che produca questo comportamento e che sia stata creata prima che questa sfida fosse pubblicata? In caso contrario, questa risposta non è valida.
- I controlli dei limiti sono specifici dellimplementazione, quindi ‘ sono sicuro che alcuni potrebbero generare errori.Qualche SIGSEGV però? Ne dubito. Tuttavia, esiste un gran numero di programmi che dipendono dalla disposizione dellarray a sinistra. Può essere piuttosto conveniente avere uno spazio di archiviazione espandibile su entrambi i lati.
Rispondi
Haskell, 31
foreign import ccall main::IO()
Questo produce un segfault quando viene compilato con GHC ed eseguito. Non sono necessari flag di estensione, poiché linterfaccia della funzione esterna è nello standard Haskell 2010.
Commenti
- Awwww. Volevo pubblicare
import Foreign;main=peek nullPtr::IO Int
, ma i ‘ sono 40.
Risposta
Bash, 4 byte
Golfed
. $0
Includi ricorsivamente lo script in se stesso.
Spiegato
Ricorsivo ” sorgente ” (.) loperazione causa eventualmente un overflow dello stack e poiché Bash non si integra con libsigsegv , questo si traduce in un SIGSEGV.
Nota che questo non è un bug, ma un comportamento previsto, come discusso qui .
Test
./bang Segmentation fault (core dumped)
Risposta
Python 33
import os os.kill(os.getpid(),11)
Invio del segnale 11 (SIGSEGV) in Python.
Commenti
- Anche 33 caratteri:
from os import*
ekill(getpid(),11)
Risposta
C – 11 (19) 7 (15) 6 (14) 1 carattere, AT & T x86 assembler – 8 (24) caratteri
La versione C è:
*(int*)0=0;
Lintero programma (non proprio ISO -compliant, supponiamo che K & RC) sia lungo 19 caratteri:
main(){*(int*)0=0;}
Assembler variante:
orl $0,0
Lintero programma è lungo 24 caratteri (solo per valutazione, poiché non è effettivamente assemblatore):
main(){asm("orl $0,0");}
MODIFICA :
Un paio di varianti C. Il primo utilizza linizializzazione zero della variabile puntatore globale:
*p;main(){*p=0;}
Il secondo utilizza la ricorsione infinita:
main(){main();}
Lultima variante è la più corta – 7 (15) caratteri.
MODIFICA 2 :
ha inventato unaltra variante più corta di qualsiasi delle precedenti – 6 (14) caratteri. Si presuppone che le stringhe letterali siano inserite in un segmento di sola lettura.
main(){*""=0;}
EDIT 3 :
E il mio ultimo tentativo – lungo 1 carattere:
P
Compilalo in questo modo :
cc -o segv -DP="main(){main();}" segv.c
Commenti
- in C isn ‘ t main; solo 5 caratteri
- : Linker non ‘ controlla se main è una funzione o meno. il caricatore e restituisce sigsegv
- @FUZxxl In questo caso
main
è una variabile int globale inizializzata zero, quindi ciò che otteniamo è un risultato del tentativo di eseguire alcuni byte zero. In x86 ‘ dovrebbe essere qualcosa comeadd %al,(%rax)
che è unistruzione perfettamente valida che cerca di raggiungere la memoria allindirizzo memorizzato in%rax
. Le possibilità di avere un buon indirizzo lì sono minime. - Ovviamente lultima voce può essere usata per tutto, devi solo fornire gli argomenti corretti del compilatore. Il che dovrebbe renderlo il vincitore automatico di qualsiasi concorso di golf in codice. 🙂
- Solitamente i flag del compilatore diversi da quelli che scelgono la versione della lingua da utilizzare vengono conteggiati nel totale.
Risposta
Perl, 10/12 caratteri
Una soluzione leggermente ingannevole è radere un carattere Joey Adams “trucco bash :
kill 11,$$
Tuttavia, per ottenere un reale segfault in Perl, unpack p
è la soluzione più ovvia :
unpack p,1x8
Tecnicamente, non è “garantito segfault, poiché lindirizzo 0x31313131 (o 0x3131313131313131 su sistemi a 64 bit) potrebbe semplicemente puntare a uno spazio di indirizzi valido per caso. Ma le probabilità sono contro. Inoltre, se perl viene mai portato su piattaforme in cui i puntatori sono più lunghi di 64 bit, il x8
dovrà essere aumentato.
Commenti
- Cosè questa
1x8
cosa? - @HannesKarppila È ‘ un modo breve per scrivere
"11111111".
Risposta
dc – 7 caratteri
[dx0]dx
causa un overflow dello stack
Commenti
- Funziona, ma puoi approfondire? Perché si comporta in questo modo?
-
[dx0]
memorizzadx0
nello stack, quindid
duplica lelemento dello stack superiore, quindix
apre lelemento dello stack superiore (dx0
) e lo esegue. Che duplica lelemento dello stack superiore e inizia a eseguirlo … il0
deve essere lì per evitare che questa sia una chiamata di coda, quindi si accumulano tutti.
Risposta
PicoLisp – 4 caratteri
$ pil : ("0) Segmentation fault
Questo è il comportamento previsto. Come descritto sul loro sito web:
Se alcuni linguaggi di programmazione affermano di essere il “coltellino svizzero della programmazione”, allora PicoLisp potrebbe essere chiamato “Scalpel of Programming “: acuto, preciso, piccolo e leggero, ma anche pericoloso nelle mani degli inesperti.
Risposta
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
Commenti
- Bel primo post.
Risposta
In realtà , 17 16 11 10 9 byte
⌠[]+⌡9!*.
Se quanto sopra non si interrompe, prova ad aumentare il numero (i numeri a più cifre sono specificati in In realtà con i due punti iniziali )
Blocca linterprete r sfruttando un bug in Python che coinvolge oggetti itertools.chain
profondamente nidificati, che in realtà utilizza per implementare +
.
Risposta
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, forza 0 (memorizzato come valore immediato 1, a causa del bit del tag utilizzato dal GC) a un tipo di funzione (memorizzato come puntatore). Quindi, cerca di dereferenziare lindirizzo 1 e questo ovviamente segfault.
Commenti
-
it coerces 0 (stored as the immediate value 1)
– perché 0 è memorizzato come 1? - @Skyler see edit
-
Obj.magic()0
è un carattere più corto 🙂
Risposta
Pyth, 3 caratteri
j1Z
Questa sarebbe la parte in cui spiego come ho trovato questa risposta, tranne che legittimamente non ho idea . Se qualcuno potesse spiegarmelo, te ne sarei grato.
Eccolo qui in un interprete online.
Spiegazione
j
piazza la base e chiama se stessa in modo ricorsivo finché la base non è grande almeno quanto il numero. Poiché la base è 0 , non accade mai. Con un limite di ricorsione sufficientemente alto, ottieni un segfault.
Commenti
- Ho capito qualcosa! Dallesplorazione della sorgente di Pyth ‘, ho scoperto che questo codice
j
su1
e0
, che cerca di convertire1
in base0
. Perché questo segfaults, non ho idea … - Vedi qui .
j
piazza la base e chiama se stessa in modo ricorsivo finché la base non è grande almeno quanto il numero. Poiché la base è 0 , ciò non accade mai. Con un limite di ricorsione sufficientemente alto, ottieni un segfault. - @Dennis IDEone
- @SeeRhino The Pyth interpreter imposta il limite di ricorsione a 100.000. Almeno su TIO, quella ‘ è sufficiente per un segfault.
Risposta
C # – 62
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
C # / unsafe, 23 byte
unsafe{int i=*(int*)0;}
Per qualche motivo non capisco, *(int*)0=0
genera solo uneccezione NullReferenceException, mentre questa versione fornisce la corretta violazione di accesso.
Commenti
-
int i=*(int*)0;
restituisce uneccezione NullReferenceException per me. - Puoi provare ad accedere a una posizione negativa, come
*(int*)-1=0
e ottenere una violazione di accesso. - Leccezione particolare è proprio quella che il clr lo avvolge ed è insignificante. Il sistema operativo stesso dà effettivamente lerrore di seg in tutti questi casi.
- Il motivo per cui
*(int*)0=0
genera uneccezione è probabilmente dovuto allottimizzazione. In particolare, per evitare il costo del controllo dinull
, lottimizzatore potrebbe rimuovere i controlli nulli, ma quando si verifica un segfault potrebbe rilanciarlo comeNullReferenceException
.
Risposta
19 caratteri in C
main(a){*(&a-1)=1;}
Corrompe il valore dellindirizzo di ritorno della funzione principale, quindi ottiene un SIGSEGV al ritorno di main
.
Commenti
- Dipende dal layout dello stack frame, quindi in alcune architetture non può fallire.
- Perché non semplicemente
main;
omain(){*""=0;}
? - @Sapphire_Brick
main;
è già fornito in unaltra risposta. - @saeedn Allora perché postarlo? Questo non è ‘ nemmeno il secondo al più corto!
- @Sapphire_Brick Allepoca stavo postando il mio,
main;
non ‘ t pubblicato e ‘ non sapevo che funzionasse. Stavo solo facendo notare che è già stato dato e non ha senso cambiare la mia risposta. Inoltre, le persone qui non ‘ postano solo per il più breve, a volte è interessante anche un modo diverso di risolvere il problema.
Risposta
Cython, 14
Questo spesso è utile per scopi di debug.
a=(<int*>0)[0]
Risposta
J (6)
memf 1
memf
significa memoria libera, 1
viene interpretato come un puntatore.
Commenti
- Perché
1
invece di0
? È legale liberare un puntatore nullo in J?
Risposta
Matlab – Sì, è possibile!
In risposta a una mia domanda , Amro ha avuto questa stranezza:
S = struct(); S = setfield(S, {}, "g", {}, 0)
Commenti
- Fornisci la versione Matlab – R2015B (e anche 2016B) genera un errore: Errore nelluso di setfield (riga 56) Almeno uno index è obbligatorio.
- @FlorianCastellane Non è in grado di provare tutte le versioni ora, ma è stato confermato che fornisce un segfault in alcune versioni, lultima è la 2014b e la prima 2012a.
Risposta
C – 14 caratteri
Assicurati di compilare un file vuoto con cc -nostartfiles c.c
Spiegazione:
Quello che è andato storto è che abbiamo trattato _start come se fosse una funzione C, e ha cercato di tornare da esso. In realtà, non è affatto una funzione. È solo un simbolo nel file oggetto che il linker usa per localizzare il punto di ingresso del programma. Quando il nostro programma viene invocato, viene invocato direttamente. Se dovessimo guardare, vedremmo che il valore in cima allo stack è il numero 1, che è certamente molto simile a un indirizzo. In effetti, ciò che è sullo stack è il valore argc del nostro programma. Dopo questo vengono gli elementi dellarray argv, incluso lelemento di terminazione NULL, seguito dagli elementi di envp. E questo è tutto. Non è presente alcun indirizzo di ritorno nello stack.
Commenti
- I ‘ sono abbastanza sicuro che tu debba segnare con gli argomenti aggiuntivi
- Devi aggiungere 14 byte per il flag speciale.
- @ErikGolfer エ リ ッ ク ゴ ル フ ァ ー -nostartfiles è in realtà è lungo 13 byte 🙂
- @CharlesPaulet Penso che tu debba contare anche lo spazio.
Risposta
Assemblaggio Unix PDP-11, 18 byte binari, 7 byte sorgente
(questo sta diventando un tema con me, forse perché è lunico linguaggio che conosco in un certo senso che no- un altro qui lo fa.)
inc(r0)
Incrementa il singolo byte indirizzato dal valore iniziale di r0 [che sembra essere 05162 secondo il debugger simh] a partire da avvio 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.
Ne ho fatti alcuni tenta di accorciare la sorgente, ma è sempre finito ge scrivendo un errore di sintassi o SIGBUS.