Korteste kode som reiser en SIGSEGV

Skriv den korteste koden som reiser en Segmenteringsfeil (SIGSEGV) på ethvert programmeringsspråk.

Kommentarer

  • Wow. Muligens det korteste vellykkede spørsmålet.
  • @MatthewRoh Av interesse gjorde jeg dette SEDE-spørsmålet. Det ser ut til at det er noen få med +10 eller høyere, men dette er den første over +40

Svar

C, 5 tegn

main; 

Det «en variabel erklæring – int typen er underforstått (funksjonen er kopiert fra B-språk) og 0 er standardverdi. Når det kjøres, prøver dette å utføre et tall (tall kan ikke kjøres), og forårsaker SIGSEGV .

Prøv det online!

Kommentarer

  • @Macmade: Egentlig er det 0. static variabler starter som 0, og main; er static, som jeg erklærte det utenfor funksjon. c-faq.com/decl/initval.html
  • sist jeg spilte med denne tingen, fant jeg ut at der ‘ er en annen årsak til segfaulten. Først av alt ved å kalle main hopper du til hovedstedet, ikke verdien, en annen ting er main er et int, det ‘ s ligger i .bss, vanligvis er funksjonene plassert i .text, når kjernen laster inn elf-programmet, oppretter den en kjørbar side for .text og ikke-kjørbar for .bss, så ved å ringe main hopper du til en ikke-kjørbar side, og utførelse noe på en slik side er en beskyttelsesfeil.
  • Jepp, segfaults i C er stort sett standard: P
  • main __attribute__((section(".text#")))=0xc3; FTFY (i det minste ser det ut til å komme tilbake uten krasjer på min x86).
  • @jozxyqk Eller kortere, const main=195;. Så interessant det er at det ‘ fungerer, målet med denne kodegolfutfordringen var å få koden til å bli feil, ikke å fungere :).

Svar

Bash, 11            

kill -11 $$ 

Kommentarer

  • Signal 11 med 11 tegn. Virker legit.
  • @ nyuszika7h Jeg skulle oppstemme kommentaren din, men du har 11 oppstemmer akkurat nå, så jeg ‘ kommer til å la være med det. : P
  • @AlexL. andre mennesker ser ut til å ha bortskjemt med det 🙁
  • @theonlygusti Ja … At ‘ er for ille. 🙁 Vel, da kan jeg stemme på det nå .
  • Opptil 42 upvotes, no touchee!

Answer

Assembly (Linux , x86-64), 1 byte

RET 

Denne koden er feil.

Kommentarer

  • Som en MSDOS .com-fil, kjører den og avsluttes uten feil.
  • Poenget mitt er: bare å spesifisere “montering” er ikke ‘ t nok til å gjøre det segfault.
  • @JB: På MS DOS vil ingen program noensinne produsere en segmenteringsfeil. At ‘ er fordi MS DOS kjører i reell modus der minnebeskyttelse ikke er eksisterende.
  • @celtschk IIRC NTVDM vil utslette på ikke-eksisterende adresser, og de som ikke er tildelt MS-DOS. li> @celtschk: Du kan segfault det uansett slik: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] – > CPU raise er den underliggende SEGV (AFAIK der ‘ er det ingen som håndterer det skjønt).

Svar

Python 2, 13

exec"()"*7**6 

Windows rapporterer en feilkode på c00000fd (Stack Overflow) som jeg antar er en undertype av segmenteringsfeil.

Takket være Alex A. og Mego er det bekreftet at det også forårsaker segmenteringsfeil på Mac- og Linux-systemer. Python er det valgte språket for bærbart å krasje programmene dine.

Kommentarer

  • Segmentation fault: 11 på Mac
  • Segmentation fault (core dumped) på Linux
  • Legger dette på før?
  • @MegaMan As in tar lang tid å fullføre ? Nei, 7 ** 6 er bare omtrent 100K, så ‘ er ingen merkbar forsinkelse.
  • @MaxGasner Prøv å lese programmeringsspråket igjen 🙂

Svar

pdfTeX ( 51)

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

Dette er sannsynligvis en feil , men den er ikke til stede i den originale TeX, skrevet av Knuth: å samle koden med tex filename.tex i stedet for pdftex filename.tex gir ikke en segfault.

Svar

LOLCODE, 4 byte

OBTW 

Fungerer ikke online, bare i C-tolken.

Kommentarer

  • LOL FANCY CODE M8 8/8 KTHXBYE

Svar

Python, 33 tegn

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

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

Python, 60 tegn

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

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

Dette er Python versio n Jeg tester på:

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

Generelt er Python-tolk vanskelig å krasje, men det ovennevnte er selektiv misbruk …

Svar

Frem – 3 tegn

0 @ 

(@ er en henting)

Kommentarer

  • Kortest hittil som vil fungere på moderne systemer.
  • Hvilken fremtid? Gforth sier bare » Ugyldig minneadresse »

Svar

W32 .com kjørbar – 0 byte

Dette vil virke rart, men på 32-biters Windows-systemer kan det opprette og utføre en tom .com-fil forårsake en segfault, avhengig av … noe. DOS godtar det bare (8086 har ingen minnestyring, det er ingen meningsfulle segmenter å utsette), og 64-biters Windows nekter å kjøre den (x86-64 har ingen v86-modus for å kjøre en .com-fil i).

Svar

C, 18

main(){raise(11);} 

Kommentarer

  • trenger du å legge til #include < signal.h > i kodelisten?
  • @FlorianCastellane: i C90 og lavere, for ethvert funksjonsanrop utført uten en synlig erklæring, erklærer kompilatoren det implisitt som int func(). dvs. en funksjon som returnerer int, og tar uspesifiserte parametere. I dette tilfellet er raise en funksjon som returnerer int, tar et int-argument, så dette ordner seg (selv om kompilatoren klager).
  • @Hasturkun main(){main();}

Svar

Perl (< 5.14), 9 tegn

/(?{??})/ 

I 5.14 ble regex-motoren gjort omstyrt slik at den ikke kunne krasje på denne måten, men 5.12 og tidligere vil segfault hvis du prøver dette.

Kommentarer

  • Jeg kan gjengi dette på Perl 5.14 (Debian) og 5.18 (Arch Linux). sprunge.us/RKHT
  • Gjengitt med Perl v5.20.2 (windows)
  • Hva med /(?R)/ på eldre Perl-versjoner?

Svar

brainfuck (2)

<. 

Ja, dette er implementeringsavhengig. SIGSEGV er det sannsynlige resultatet fra en god kompilator.

Kommentarer

  • Hvordan er en kompilator som deler feil på den » bra «? At < enten ikke skal ha noen effekt eller vikle seg rundt.
  • Det er best å produsere en kjøretidsfeil ved grenseverdier fordi det lar programmereren finne og fikse feilen som raskt som mulig. Å la buggy-programmet kjøre en stund og ødelegge hukommelsen tilfeldig før du krasjer, gjør det vanskeligere å diagnostisere. Å forhindre krasj helt, som du antyder, er verst; programmereren kan få programmet » som arbeider » og deretter bli ydmyket offentlig når det krasjer på standard kompilatorer og tolker.
  • Omvendt er det ikke mulig å fange grenseverdier før kjøretid generelt, og heller ikke spesielt nyttig i tilfeller der det er mulig. Å produsere en mer beskrivende kjøretidsfeil vil være greit, men å ha operativsystemet til å fange det som en segfault er flott fordi det ikke ‘ ikke har noen hastighetskostnad. (Hvis det ‘ ikke er klart, gjør ikke kompilatoren seg selv ‘ t – det produserer kjørbare filer som segfault så snart de prøver for å få tilgang til minne utenfor grensene.)
  • Kan du gi en implementering som gir denne oppførselen og ble opprettet før denne utfordringen ble lagt ut? Hvis ikke, er dette svaret ugyldig.
  • Grensekontrollene er implementeringsspesifikke, så jeg ‘ er sikker på at det er noen som kan feile på det.Ville noen SIGSEGV skjønt? Det tviler jeg på. Det er et stort antall programmer som avhenger av matrisen innpakning til venstre skjønt. Det kan være ganske praktisk å ha dyrkbar lagring på begge sider.

Svar

Haskell, 31

foreign import ccall main::IO() 

Dette gir en segfault når den kompileres med GHC og kjøres. Ingen utvidelsesflagg er nødvendig, siden Foreign Function Interface er i Haskell 2010-standarden.

Kommentarer

  • Awwww. Jeg skulle legge ut import Foreign;main=peek nullPtr::IO Int, men at ‘ s 40.

Svar

Bash, 4 byte

Golfet

 . $0  

Inkluder skriptet rekursivt i seg selv.

Forklart

Rekursiv » kilde » (.) -operasjon forårsaker en stabeloverløp til slutt, og da Bash ikke integreres med libsigsegv , dette resulterer i en SIGSEGV.

Merk at dette ikke er en feil, men en forventet oppførsel, som diskutert her .

Test

 ./bang Segmentation fault (core dumped)  

Prøv det online!

Svar

Python 33

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

Sender signal 11 (SIGSEGV) i python.

Kommentarer

  • Også 33 tegn: from os import* og kill(getpid(),11)

Svar

C – 11 (19) 7 (15) 6 (14) 1 tegn, AT & T x86 assembler – 8 (24) tegn

C-versjonen er:

*(int*)0=0; 

Hele programmet (ikke helt ISO -kompatibel, la oss anta at det er K & RC) er 19 tegn lang:

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

Assembler variant:

orl $0,0 

Hele programmet er 24 tegn (bare for evaluering, siden det egentlig ikke er en samler):

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

EDIT :

Et par C-varianter. Den første bruker null initialisering av global pekervariabel:

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

Den andre bruker uendelig rekursjon:

main(){main();} 

Den siste varianten er den korteste – 7 (15) tegn.

EDIT 2 :

Oppfant en variant til som er kortere enn noen av de ovennevnte – 6 (14) tegn. Den forutsetter at bokstavelige strenger blir satt inn i et skrivebeskyttet segment.

main(){*""=0;} 

EDIT 3 :

Og mitt siste forsøk – 1 tegn langt:

P 

Bare kompiler det slik :

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

Kommentarer

  • i C er ikke ‘ t main; bare 5 charter
  • : Linker kontrollerer ikke ‘ t sjekk om main er funksjon eller ikke. Den bare sendes til lasteren og returner sigsegv
  • @FUZxxl I dette tilfellet er main en nullinitialisert global int-variabel, så det vi får er et resultat av å prøve å kjøre noen null byte. I x86 er det ‘ d noe som add %al,(%rax) som er en perfekt gyldig instruksjon som prøver å nå minne på adressen som er lagret i %rax. Sjansene for å ha en god adresse der er minimale.
  • Selvfølgelig kan den siste oppføringen brukes til alt, du må bare oppgi de rette kompilatorargumentene. Som burde gjøre det til den automatiske vinneren av en kodegolfkonkurranse. 🙂
  • Vanligvis telles kompilatorflagg enn de som velger språkversjonen som skal brukes, til summen.

Svar

Perl, 10/12 chars

En litt cheatish løsning er å barbere en røye av Joey Adams «bash trick :

kill 11,$$ 

For å få en ekte segfault i Perl er unpack p den åpenbare løsningen :

unpack p,1x8 

Teknisk sett er dette ikke garantert å segfault, siden adressen 0x31313131 (eller 0x3131313131313131 på 64-biters systemer) bare kan peke på gyldig adresseplass ved en tilfeldighet. Men oddsen er imot det. Hvis perl noen gang blir portet til plattformer der pekere er lengre enn 64 bits, må x8 økes.

Kommentarer

  • Hva er denne 1x8 tingen?
  • @HannesKarppila Det ‘ er en kort vei å skrive "11111111".

Svar

dc – 7 tegn

[dx0]dx 

forårsaker en stabeloverløp

Kommentarer

  • Er verk, men kan du utdype det? Hvorfor oppfører den seg slik?
  • [dx0] lagrer dx0 på bunken, så d dupliserer toppstakelementet, så x spretter toppstakelementet (dx0) og utfører det. Som dupliserer toppstabelelementet, og begynner å utføre det … 0 må være der for å forhindre at dette er et haleoppkall, slik at de alle bygger seg opp.

Svar

PicoLisp – 4 tegn

$ pil : ("0) Segmentation fault 

Dette er ment oppførsel. Som beskrevet på nettstedet deres:

Hvis noen programmeringsspråk hevder å være «Swiss Army Knife of Programming», kan PicoLisp godt kalles «Scalpel av programmering «: Skarp, nøyaktig, liten og lett, men også farlig i hånden til de uerfarne.

Svar

F90 – 39 byte

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

Kompilering:

gfortran segv.f90 -o segv 

Utførelse:

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

Materialer:

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

Kommentarer

  • Fint første innlegg.

Svar

Egentlig , 17 16 11 10 9 byte

⌠[]+⌡9!*. 

Prøv det online!

Hvis det ovennevnte ikke krasjer, prøv å øke antallet (flersifrede tall er angitt i Faktisk med et ledende kolon )

Krasjer tolken r ved å utnytte en feil i python som involverer dypt nestede itertools.chain objekter, som faktisk bruker til å implementere + operatør.

Svar

OCaml, 13 byte

Obj.magic 0 0 

Dette bruker funksjonen Obj.magic, som usikkert tvinger noen to typer. I dette tilfellet tvinger den 0 (lagret som den umiddelbare verdien 1 på grunn av tagbiten som brukes av GC) til en funksjonstype (lagret som en peker). Dermed prøver den å referere til adresse 1, og det vil selvfølgelig segfe.

Kommentarer

  • it coerces 0 (stored as the immediate value 1) – hvorfor er 0 lagret som 1?
  • @Skyler se rediger
  • Obj.magic()0 er ett tegn kortere 🙂

Svar

Pyth, 3 tegn

j1Z 

Dette ville være den delen der jeg forklarte hvordan jeg kom på dette svaret, bortsett fra at jeg legitimt ikke har ingen anelse . Hvis noen kunne forklare dette for meg, ville jeg være takknemlig.

Her er det i en online tolk.

Forklaring

j kvadrerer basen og kaller seg rekursivt til basen er minst like stor som tallet. Siden basen er 0 skjer aldri. Med en tilstrekkelig høy rekursjonsgrense får du en segfault.

Dennis ♦

Kommentarer

  • Fant ut noe! Fra å surfe på Pyth ‘ s kilde, fant jeg ut at denne koden j1 og 0, som prøver å konvertere 1 til base 0. Hvorfor det er feil, har jeg ikke idé …
  • Se her . j kvadrerer basen og kaller seg rekursivt til basen er minst like stor som tallet. Siden basen er 0 , skjer det aldri. Med en tilstrekkelig høy rekursjonsgrense får du en segfault.
  • @Dennis IDEone
  • @SeeRhino The Pyth-tolk setter rekursjonsgrensen til 100.000. I det minste på TIO er det ‘ nok for en segfault.

Svar

C # – 62

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

C # / usikker, 23 byte

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

Av en eller annen grunn forstår jeg ikke, *(int*)0=0 kaster bare et NullReferenceException, mens denne versjonen gir riktig tilgangsbrudd.

Kommentarer

  • int i=*(int*)0; returnerer et NullReferenceException for meg.
  • Du kan prøve å få tilgang til en negativ plassering, som *(int*)-1=0 og få tilgangsbrudd.
  • Det spesielle unntaket er akkurat det clr pakker den inn, og er ubetydelig. OS-en gir faktisk seg-feilen i alle disse tilfellene.
  • Årsaken til at *(int*)0=0 kaster et unntak, er sannsynligvis på grunn av optimalisering. Spesielt for å unngå kostnadene ved å sjekke for null, kan optimalisereren fjerne nullkontroller, men når en segfault oppstår, kan den kaste den på nytt som en riktig NullReferenceException.

Svar

19 tegn i C

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

Det ødelegger returadresseverdien til hovedfunksjonen, så den får en SIGSEGV ved retur av main.

Kommentarer

  • Det avhenger av stabelrammens layout, så i noen arkitektur kan det muligens ikke mislykkes.
  • Hvorfor ikke bare main;, eller main(){*""=0;}?
  • @Sapphire_Brick main; er allerede gitt i et annet svar.
  • @saeedn Hvorfor legge det ut i det hele tatt? Denne er ikke ‘ t til og med den nest korteste!
  • @Sapphire_Brick På det tidspunktet jeg la ut mitt, main; var ikke ‘ t lagt ut, og jeg visste ikke ‘ at det fungerer. Jeg påpekte bare at det allerede er gitt, og ikke noe poeng i å endre svaret mitt. Videre legger ikke folk her ‘ til bare bare for det korteste, noen ganger er en annen måte å løse problemet på, også interessant.

Svar

Cython, 14

Dette kommer ofte til nytte for feilsøkingsformål.

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

Svar

J (6)

memf 1 

memf betyr ledig minne, 1 tolkes som en peker.

Kommentarer

  • Hvorfor 1 i stedet for 0? Er det lovlig å frigjøre en nullpeker i J?

Svar

Matlab – Ja det er mulig!

Som svar på et spørsmål til meg, kom Amro med denne særegenheten:

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

Kommentarer

  • Gi Matlab-versjon – R2015B (og 2016B også) bare kaster en feil: Feil ved bruk av setfield (linje 56) Minst en indeks er nødvendig.
  • @FlorianCastellane Kan ikke prøve alle versjoner nå, men det er bekreftet å gi en segfault i ganske mange versjoner, den siste er 2014b og den tidligste 2012a.

Svar

C – 14 tegn

Husk å kompilere en tom fil med cc -nostartfiles c.c

Forklaring:

Det som gikk galt er at vi behandlet _start som om det var en C-funksjon, og prøvde å komme tilbake fra den. I virkeligheten er det ikke en funksjon i det hele tatt. Det er bare et symbol i objektfilen som linkeren bruker for å finne inngangspunktet til programmet. Når vårt program påkalles, blir det påkalt direkte. Hvis vi skulle se, ville vi se at verdien på toppen av bunken var tallet 1, som absolutt er veldig un-adresse-aktig. Faktisk er det som er på bunken vårt program s argc-verdi. Etter dette kommer elementene i argv-arrayet, inkludert det avsluttende NULL-elementet, etterfulgt av elementene i envp. Og det er alt. Det er ingen returadresse på bunken.

Kommentarer

  • I ‘ er ganske sikker på at du må score med tilleggsargumentene
  • Du må legge til 14 byte for det spesielle flagget.
  • @ErikGolfer エ リ ッ ク ゴ フ ァ ァ -nostartfiles is faktisk 13 byte lang 🙂
  • @CharlesPaulet Jeg tror du må telle plassen også.

Svar

Unix PDP-11-samling, 18 byte binær, 7 byte kilde

(dette blir et tema for meg, kanskje fordi det er det eneste språket jeg liksom vet at ingen- en annen her gjør.)

inc(r0) 

Øker enkeltbyten adressert av den opprinnelige verdien av r0 [som tilfeldigvis er 05162 i henhold til simh-feilsøkingsprogrammet] per programstart.

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

Og som alltid kan de fremmede byte på slutten fjernes med stripe.

Jeg laget noen få forsøk på å få kilden kortere, men endte alltid opp med ge enten syntaksfeil eller SIGBUS.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *