Kortaste koden som höjer en SIGSEGV

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 .

Prova online!

Kommentarer

  • @Macmade: Det är faktiskt 0. static variabler börjar som 0, och main; är static, 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 returnerar int, med ospecificerade parametrar. I det här fallet är raise 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)  

Prova online!

Svar

Python 33

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

Skickar signal 11 (SIGSEGV) i python.

Kommentarer

  • Även 33 tecken: from os import* och kill(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 som add %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] lagrar dx0 på stacken och sedan d duplicerar det översta stackelementet, sedan x 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!*. 

Prova online!

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.

Här är det i en online-tolk.

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.

Dennis ♦

Kommentarer

  • Tänkte på något! När jag tittade på Pyth ’ s källa, fann jag att den här koden j1 och 0, som försöker konvertera 1 till bas 0. 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 efter null, kan optimatorn ta bort nollkontroller, men när en segfault inträffar kan den kastas om som en riktig NullReferenceException.

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;, eller main(){*""=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 än 0? Ä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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *