Skriv den kortaste koden som höjer en Segmenteringsfel (SIGSEGV) på vilket programmeringsspråk som helst.
Kommentarer
- Wow. Kanske den kortaste framgångsrika frågan.
- @MatthewRoh Av intresse gjorde jag denna SEDE-fråga. Det verkar som om det finns några med +10 eller högre, men det här är det första ovan +40
Svar
C, 5 tecken
main;
Det är en variabeldeklaration – int
-typ är underförstådd (funktionen kopieras från B-språk) och 0
är standardvärde. När det körs försöker detta köra ett tal (siffrorna är inte körbara) och orsakar SIGSEGV
.
Kommentarer
- @Macmade: Det är faktiskt
0
.static
variabler börjar som0
, ochmain;
ärstatic
, eftersom jag förklarade det utanför funktionen. c-faq.com/decl/initval.html - förra gången jag lekte med den här saken, tänkte jag att det ’ en annan anledning till segfaulten. Först och främst genom att ringa main hoppar du till platsen för main, inte värdet, en annan sak är
main
är ett int, det ’ s ligger i.bss
, vanligtvis finns funktioner i.text
, när kärnan laddar elfprogrammet skapas en körbar sida för.text
och icke-körbar för.bss
, så genom att ringa main hoppar du till en sida som inte kan köras och att exekvera något på en sådan sida är en skyddsfel. - Ja, segfel i C är ganska mycket standard: P
-
main __attribute__((section(".text#")))=0xc3;
FTFY (åtminstone verkar det återvända utan kraschar på min x86). - @jozxyqk Eller kortare,
const main=195;
. Så intressant det är att det ’ fungerar, målet med denna kodgolfutmaning var att göra koden till fel, inte att fungera :).
Svar
Bash, 11
kill -11 $$
Kommentarer
- Signal 11 med 11 tecken. Verkar legitimt.
- @ nyuszika7h Jag skulle rösta på din kommentar, men du har 11 röster just nu, så jag ’ kommer att lämna det där. : P
- @AlexL. andra människor verkar ha bortskämt det 🙁
- @theonlygusti Ja … Att ’ är synd. 🙁 Nåväl, då kan jag rösta på det nu .
- Upp till 42 röster, ingen touchee!
Svar
Montering (Linux , x86-64), 1 byte
RET
Denna kod skiljer sig.
Kommentarer
- Som en MSDOS .com-fil körs den och avslutas utan fel.
- Min poäng är: att bara ange ”montering” är inte ’ t tillräckligt för gör det segfault.
- @JB: På MS DOS kommer inget program någonsin att ge ett segmenteringsfel. Det ’ beror på att MS DOS körs i riktigt läge där minneskydd är obefintligt.
- @celtschk IIRC NTVDM släpper ut på icke-existerande adresser och de som inte tilldelats MS-DOS.
- @celtschk: Du kan ändå göra det fel så: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] – > CPU-höjning är den underliggande SEGV (AFAIK där ’ är dock ingen som hanterar det).
Svar
Python 2, 13
exec"()"*7**6
Windows rapporterar en felkod på c00000fd (Stack Overflow) som jag antar är en undertyp av segmenteringsfel.
Tack vare Alex A. och Mego är det bekräftat att det också orsakar segmenteringsfel på Mac- och Linux-system. Python är det språk du väljer för att krascha dina program bärbart.
Kommentarer
-
Segmentation fault: 11
på Mac -
Segmentation fault (core dumped)
på Linux - Hangar det här först?
- @MegaMan Som innan tar det lång tid att avsluta ? Nej, 7 ** 6 handlar bara om 100K så ’ är ingen märkbar fördröjning.
- @MaxGasner Försök läsa programmeringsspråket igen 🙂
Svar
pdfTeX ( 51)
\def~#1{\meaning}\write0{\expandafter~\string}\bye
Detta är faktiskt troligen ett fel , men det finns inte i den ursprungliga TeX, skriven av Knuth: att sammanställa koden med tex filename.tex
istället för pdftex filename.tex
ger inte en segfault.
Svar
LOLCODE, 4 byte
OBTW
Fungerar inte online, bara i C-tolk.
Kommentarer
- LOL FANCY CODE M8 8/8 KTHXBYE
Svar
Python, 33 tecken
>>> import ctypes;ctypes.string_at(0) Segmentation fault
Källa: http://bugs.python.org/issue1215#msg143236
Python, 60 tecken
>>> import sys;sys.setrecursionlimit(1<<30);f=lambda f:f(f);f(f) Segmentation fault
Källa: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup
Detta är Python versio n Jag testar på:
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] on darwin
I allmänhet är Python-tolk svår att krascha, men ovanstående är selektiv missbruk …
Svar
Framåt – 3 tecken
0 @
(@
är en hämtning)
Kommentarer
- Kortast hittills som fungerar på moderna system.
- Vilken framåt? Gforth säger bara ” Ogiltig minnesadress ”
Svar
W32 .com körbar – 0 byte
Detta verkar konstigt, men på 32-bitars Windows-system kan en tom com-fil skapas och köras kan orsaka en segfault, beroende på … något. DOS accepterar det bara (8086 saknar minneshantering, det finns inga meningsfulla segment att göra fel) och 64-bitars Windows vägrar att köra det (x86-64 har inget v86-läge för att köra en .com-fil).
Svar
C, 18
main(){raise(11);}
Kommentarer
- behöver du lägga till #include < signal.h > i kodlistan?
- @FlorianCastellane: i C90 och lägre, för alla funktionssamtal som görs utan en synlig deklaration, förklarar kompilatorn implicit det som
int func()
. dvs. en funktion som returnerarint
, med ospecificerade parametrar. I det här fallet ärraise
en funktion som returnerar int, tar ett int-argument, så det fungerar (även om kompilatorn klagar). - @Hasturkun
main(){main();}
Svar
Perl (< 5.14), 9 tecken
/(?{??})/
I 5.14 gjordes regex-motorn återintensiv så att den inte kunde krascha på detta sätt, utan 5.12 och tidigare kommer att fel om du försöker detta.
Kommentarer
- Jag kan återge detta på Perl 5.14 (Debian) och 5.18 (Arch Linux). sprunge.us/RKHT
- Reproducerad med Perl v5.20.2 (windows)
- Vad sägs om
/(?R)/
på äldre Perl-versioner?
Svar
brainfuck (2)
<.
Ja, det här är implementeringsberoende. SIGSEGV är det troliga resultatet från en bra kompilator.
Kommentarer
- Hur är en kompilator som skiljer sig åt den ” bra ”? Att
<
antingen inte ska ha någon effekt eller linda. - Omedelbart producera ett runtime-fel vid gränsöverträdelse är bäst eftersom det låter programmeraren hitta och åtgärda felet som snabbt som möjligt. Att låta buggy-programmet köras ett tag och skada minnet slumpmässigt innan det kraschar gör det bara svårare att diagnostisera. Att förhindra kraschen helt, som du föreslår, är värst; programmeraren kan få programmet ” som arbetar ” och sedan förödmjukas offentligt när det kraschar på standardkompilatorer och tolkar.
- Omvänt är det i allmänhet inte möjligt att ta gränsöverskridanden före körning eller särskilt användbart i de fall där det är möjligt. Att producera ett mer beskrivande runtime-fel skulle vara okej, men att ha operativsystemet att fånga det som en segfault är bra eftersom det inte ’ t har någon hastighetskostnad. (Om det ’ inte är klart, gör inte kompilatorn sig själv ’ t – det producerar körbara filer som segfault så fort de försöker för att komma åt minne utanför gränserna.)
- Kan du tillhandahålla en implementering som ger detta beteende och skapades innan denna utmaning publicerades? Om inte är det här svaret ogiltigt.
- Gränskontrollerna är specifika för implementeringen, så jag ’ är säker på att det finns några som skulle kunna fel på det.Skulle dock någon SIGSEGV? Jag tvivlar på det. Det finns dock ett stort antal program som är beroende av arrayen till vänster. Det kan vara ganska bekvämt att ha odlingsbart lager på båda sidor.
Svar
Haskell, 31
foreign import ccall main::IO()
Detta ger en segfault när den kompileras med GHC och körs. Inga tilläggsflaggor behövs, eftersom gränssnittet för utländsk funktion finns i Haskell 2010-standarden.
Kommentarer
- Awwww. Jag skulle skicka
import Foreign;main=peek nullPtr::IO Int
, men att ’ s 40.
Svar
Bash, 4 byte
Golfat
. $0
Inkludera skriptet i sig själv.
Förklaras
Rekursiv ” källa ” (.) -åtgärd orsakar så småningom ett stacköverflöde, och eftersom Bash inte integreras med libsigsegv , detta resulterar i en SIGSEGV.
Observera att detta inte är ett fel utan ett förväntat beteende, som diskuteras här .
Testa
./bang Segmentation fault (core dumped)
Svar
Python 33
import os os.kill(os.getpid(),11)
Skickar signal 11 (SIGSEGV) i python.
Kommentarer
- Även 33 tecken:
from os import*
ochkill(getpid(),11)
Svar
C – 11 (19) 7 (15) 6 (14) 1 tecken, AT & T x86 assembler – 8 (24) tecken
C-versionen är:
*(int*)0=0;
Hela programmet (inte riktigt ISO -kompatibel, låt oss anta att det är K & RC) är 19 tecken lång:
main(){*(int*)0=0;}
Assembler variant:
orl $0,0
Hela programmet är 24 tecken långt (bara för utvärdering, eftersom det egentligen inte är monterare):
main(){asm("orl $0,0");}
EDIT :
Ett par C-varianter. Den första använder nollinitialisering av global pekervariabel:
*p;main(){*p=0;}
Den andra använder oändlig rekursion:
main(){main();}
Den sista varianten är den kortaste – 7 (15) tecken.
EDIT 2 :
Uppfann ytterligare en variant som är kortare än någon av ovanstående – 6 (14) tecken. Det förutsätter att bokstavliga strängar placeras i ett skrivskyddat segment.
main(){*""=0;}
EDIT 3 :
Och mitt sista försök – 1 tecken långt:
P
Kompilera bara det så :
cc -o segv -DP="main(){main();}" segv.c
Kommentarer
- i C isn ’ t main; endast 5 karaktärer
- : Linker kontrollerar inte ’ t om main är funktion eller inte. Det skickas bara till lastaren och returnera sigsegv
- @FUZxxl I det här fallet
main
är en nollinitialiserad global int-variabel, så vad vi får är ett resultat av att försöka utföra några nollbyte. I x86 är det ’ d somadd %al,(%rax)
vilket är en perfekt giltig instruktion som försöker nå minne på adressen lagrad i%rax
. Chansen att ha en bra adress där är minimal. - Naturligtvis kan den sista posten användas för allt, du behöver bara ange rätt kompilatorargument. Vilket borde göra det till den automatiska vinnaren av alla kodgolftävlingar. 🙂
- Vanligtvis räknas andra kompilatorflaggor än de som väljer vilken språkversion som ska användas till summan.
Svar
Perl, 10/12 tecken
En lite fuskig lösning är att raka bort en röd röd Joey Adams ”bas trick :
kill 11,$$
För att få en riktig segfault i Perl är unpack p
den självklara lösningen :
unpack p,1x8
Tekniskt sett är detta inte garanterat att segfault, eftersom adressen 0x31313131 (eller 0x3131313131313131 på 64-bitars system) kanske bara pekar på giltigt adressutrymme av en slump. Men oddsen är emot det. Om perl någonsin portas till plattformar där pekare är längre än 64 bitar måste x8
ökas.
Kommentarer
- Vad är det för
1x8
? - @HannesKarppila Det ’ är en kort väg att skriva
"11111111".
Svar
dc – 7 tecken
[dx0]dx
orsakar ett stacköverflöde
Kommentarer
- Är verk, men kan du utarbeta? Varför beter sig det så?
-
[dx0]
lagrardx0
på stacken och sedand
duplicerar det översta stackelementet, sedanx
popar upp det övre stackelementet (dx0
) och kör det. Som duplicerar det översta stackelementet och börjar köra det …0
måste vara där för att förhindra att detta är ett svanssamtal, så att de alla bygger upp.
Svar
PicoLisp – 4 tecken
$ pil : ("0) Segmentation fault
Detta är avsett beteende. Som beskrivs på deras webbplats:
Om vissa programmeringsspråk hävdar att de är ”Swiss Army Knife of Programming”, kan PicoLisp mycket väl kallas ”Scalpel av programmering ”: Skarp, noggrann, liten och lätt, men också farlig hos de oerfarna.
Svar
F90 – 39 byte
real,pointer::p(:)=>null() p(1)=0. end
Sammanställning:
gfortran segv.f90 -o segv
Körning:
./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)
Material:
gfortran --version GNU Fortran (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
Kommentarer
- Trevligt första inlägg.
Svar
Egentligen , 17 16 11 10 9 byte
⌠[]+⌡9!*.
Om ovanstående inte kraschar, försök öka antalet (flersiffriga nummer anges i Egentligen med ett ledande kolon )
Kraschar tolkningen r genom att utnyttja ett fel i python som involverar djupt kapslade itertools.chain
-objekt, som faktiskt används för att implementera +
operatör.
Svar
OCaml, 13 byte
Obj.magic 0 0
Detta använder funktionen Obj.magic
, som osäkert tvingar två typer. I det här fallet tvingar den 0 (lagras som det omedelbara värdet 1 på grund av taggbiten som används av GC) till en funktionstyp (lagrad som en pekare). Således försöker den att avleda adressen 1, och det kommer naturligtvis att segfault.
Kommentarer
-
it coerces 0 (stored as the immediate value 1)
– varför är 0 lagrad som 1? - @Skyler se redigera
-
Obj.magic()0
är en karaktär kortare 🙂
Svar
Pyth, 3 tecken
j1Z
Detta skulle vara den del där jag förklarar hur jag kom fram till det här svaret, förutom att jag legitimt har ingen aning . Om någon kunde förklara detta för mig skulle jag vara tacksam.
Förklaring
j
kvadrerar basen och kallar sig rekursivt tills basen är minst lika stor som numret. Eftersom basen är 0 , händer aldrig. Med en tillräckligt hög rekursionsgräns får du en segfault.
Kommentarer
- Tänkte på något! När jag tittade på Pyth ’ s källa, fann jag att den här koden
j
på1
och0
, som försöker konvertera1
till bas0
. Varför det skiljer sig har jag ingen idé … - Se här .
j
kvadrerar basen och kallar sig rekursivt tills basen är minst lika stor som antalet. Eftersom basen är 0 så händer det aldrig. Med en tillräckligt hög rekursionsgräns får du en segfault. - @Dennis IDEone
- @SeeRhino The Pyth-tolk sätter rekursionsgränsen till 100.000. Åtminstone på TIO är det ’ tillräckligt för en segfault.
Svar
C # – 62
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
C # / osäker, 23 byte
unsafe{int i=*(int*)0;}
Av någon anledning förstår jag inte, *(int*)0=0
kastar bara en NullReferenceException, medan den här versionen ger rätt åtkomstbrott.
Kommentarer
-
int i=*(int*)0;
returnerar ett NullReferenceException för mig. - Du kan försöka komma åt en negativ plats, som
*(int*)-1=0
och få en åtkomstöverträdelse. - Det särskilda undantaget är precis vad clr slår in den och är obetydlig. Själva operativsystemet ger faktiskt segfelet i alla dessa fall.
- Anledningen till att
*(int*)0=0
ger ett undantag beror troligen på optimering. Specifikt, för att undvika kostnaden för att söka efternull
, kan optimatorn ta bort nollkontroller, men när en segfault inträffar kan den kastas om som en riktigNullReferenceException
.
Svar
19 tecken i C
main(a){*(&a-1)=1;}
Det korrumperar returadressvärdet för huvudfunktionen, så det får en SIGSEGV vid retur av main
.
Kommentarer
- Det beror på stackramens layout, så i vissa arkitekturer kan det eventuellt inte misslyckas.
- Varför inte bara
main;
, ellermain(){*""=0;}
? - @Sapphire_Brick
main;
ges redan i ett annat svar. - @saeedn Varför lägga upp det alls? Den här är inte ’ t ens den näst kortaste!
- @Sapphire_Brick När jag publicerade min,
main;
var inte ’ inte upplagd och jag visste inte ’ att det fungerar. Jag påpekade bara att den redan har givits och ingen mening med att ändra mitt svar. Dessutom lägger människor här ’ inte bara inlägg för det kortaste, ibland är ett annat sätt att lösa problemet också intressant.
Svar
Cython, 14
Detta kommer ofta till nytta för felsökningsändamål.
a=(<int*>0)[0]
Svar
J (6)
memf 1
memf
betyder ledigt minne, 1
tolkas som en pekare.
Kommentarer
- Varför
1
snarare än0
? Är det lagligt att frigöra en nollpekare i J?
Svar
Matlab – Ja det är möjligt!
Som svar på en -fråga till mig kom Amro med den här egenskapen:
S = struct(); S = setfield(S, {}, "g", {}, 0)
Kommentarer
- Ge Matlab-version – R2015B (och 2016B också) ger bara ett fel: Fel med setfield (rad 56) Minst en index krävs.
- @FlorianCastellane Det går inte att pröva alla versioner nu, men det har bekräftats att ge en segfault i en del versioner, den senaste är 2014b och den tidigaste 2012a.
Svar
C – 14 tecken
Var noga med att kompilera en tom fil med cc -nostartfiles c.c
Förklaring:
Vad som gick fel är att vi behandlade _start som om det var en C-funktion, och försökte återvända från det. I själva verket är det inte en funktion alls. Det är bara en symbol i objektfilen som länkaren använder för att lokalisera programmets startpunkt. När vårt program anropas, åberopas det direkt. Om vi skulle titta skulle vi se att värdet på toppen av stacken var siffran 1, vilket verkligen är väldigt un-adressliknande. Faktum är att det som finns på stacken är vårt program argc-värde. Efter detta kommer elementen i argv-arrayen, inklusive det avslutande NULL-elementet, följt av elementen i envp. Det finns ingen returadress på stacken.
Kommentarer
- I ’ jag är ganska säker på att du måste göra poäng med ytterligare args
- Du måste lägga till 14 byte för specialflaggan.
- @ErikGolfer エ リ ッ ク ゴ フ ァ ァ -nostartfiles är faktiskt 13 byte långa 🙂
- @CharlesPaulet Jag tror att du också måste räkna utrymmet.
Svar
Unix PDP-11-montering, 18 byte binära, 7 byte källa
(det här blir ett tema för mig, kanske för att det är det enda språket jag vet att ingen- en annan här gör det.)
inc(r0)
Ökar den enda byte som adresseras av det ursprungliga värdet på r0 [som råkar vara 05162 enligt simh-avlusaren] från och med programstart.
0000000 000407 000002 000000 000000 000000 000000 000000 000000 0000020 005210 000000
Och som alltid kan de yttre byten i slutet tas bort med remsa.
Jag gjorde några försöker få källan kortare, men hamnade alltid ge antingen ett syntaxfel eller SIGBUS.