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
.
Kommentarer
- @Macmade: Egentlig er det
0
.static
variabler starter som0
, ogmain;
erstatic
, 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 returnererint
, og tar uspesifiserte parametere. I dette tilfellet erraise
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)
Svar
Python 33
import os os.kill(os.getpid(),11)
Sender signal 11 (SIGSEGV) i python.
Kommentarer
- Også 33 tegn:
from os import*
ogkill(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 somadd %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]
lagrerdx0
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!*.
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.
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.
Kommentarer
- Fant ut noe! Fra å surfe på Pyth ‘ s kilde, fant jeg ut at denne koden
j
på1
og0
, som prøver å konvertere1
til base0
. 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 fornull
, kan optimalisereren fjerne nullkontroller, men når en segfault oppstår, kan den kaste den på nytt som en riktigNullReferenceException
.
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;
, ellermain(){*""=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 for0
? 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.