Skriv den korteste kode, der hæver en Segmenteringsfejl (SIGSEGV) på ethvert programmeringssprog.
Kommentarer
- Wow. Muligvis det korteste vellykkede spørgsmål.
- @MatthewRoh Af interesse lavede jeg denne SEDE-forespørgsel. Det ser ud til, at der er nogle få med +10 eller højere, men dette er det første over +40
Svar
C, 5 tegn
main;
Det “en variabel erklæring – int
typen er underforstået (funktion kopieret fra B-sprog) og 0
er standardværdi. Når det udføres, forsøger dette at udføre et tal (tal kan ikke køres) og forårsager SIGSEGV
.
Kommentarer
- @Macmade: Det er faktisk
0
.static
variabler starter som0
, ogmain;
erstatic
, da jeg erklærede det uden for funktion. c-faq.com/decl/initval.html - sidste gang jeg spillede med denne ting, regnede jeg med at der ‘ en anden grund til segfaulten. Først og fremmest ved at kalde main springer du til placeringen af main, ikke værdien, en anden ting er
main
er et int, det ‘ s placeret i.bss
, normalt er funktioner placeret i.text
, når kernen indlæser elf-programmet, oprettes en eksekverbar side til.text
og ikke-eksekverbar til.bss
, så ved at kalde main springer du til en side, der ikke kan eksekveres, og udførelse af noget på en sådan side er en beskyttelsesfejl. - Ja, segfaults i C er stort set standard: P
-
main __attribute__((section(".text#")))=0xc3;
FTFY (i det mindste ser det ud til at vende tilbage uden går ned på min x86). - @jozxyqk Eller kortere,
const main=195;
. Som interessant er det, at det ‘ fungerer, målet med denne kodegolfudfordring var at få koden til at mislykkes, ikke fungere :).
Svar
Bash, 11
kill -11 $$
Kommentarer
- Signal 11 med 11 tegn. Virker legitimt.
- @ nyuszika7h Jeg ville opstemme din kommentar, men du har 11 opstemninger lige nu, så jeg ‘ vil lade det være. : P
- @AlexL. andre mennesker synes at have forkælet det 🙁
- @theonlygusti Ja … At ‘ er for dårligt. 🙁 Åh, så kan jeg opvote det nu .
- Op til 42 upvotes, ingen touchee!
Svar
Assembly (Linux , x86-64), 1 byte
RET
Denne kode opdeles.
Kommentarer
- Som en MSDOS .com-fil kører den og afsluttes uden fejl.
- Mit punkt er: bare at angive “samling” er ikke ‘ t nok til at gør det segfault.
- @JB: På MS DOS vil intet program nogensinde producere en segmenteringsfejl. At ‘ s fordi MS DOS kører i ægte tilstand, hvor hukommelsesbeskyttelse ikke er eksisterende.
- @celtschk IIRC NTVDM vil udslette på ikke-eksisterende adresser, og dem der ikke er allokeret til MS-DOS.
- @celtschk: Du kan alligevel fejle det som sådan: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] – > CPU-hævning er den underliggende SEGV (AFAIK der ‘ er dog ingen til at håndtere det).
Svar
Python 2, 13
exec"()"*7**6
Windows rapporterer en fejlkode på c00000fd (Stack Overflow), som jeg antager er en undertype af segmenteringsfejl.
Takket være Alex A. og Mego er det bekræftet, at det også forårsager segmenteringsfejl på Mac- og Linux-systemer. Python er det valgte sprog til bærbart nedbrud på dine programmer.
Kommentarer
-
Segmentation fault: 11
på Mac -
Segmentation fault (core dumped)
på Linux - Lægger dette på først?
- @MegaMan Som i tager lang tid at afslutte ? Nej, 7 ** 6 er kun omkring 100K, så der er ‘ ingen mærkbar forsinkelse.
- @MaxGasner Prøv at læse programmeringssproget igen 🙂
Svar
pdfTeX ( 51)
\def~#1{\meaning}\write0{\expandafter~\string}\bye
Dette er faktisk sandsynligvis en fejl , men den findes ikke i den originale TeX, skrevet af Knuth: Kompilering af koden med tex filename.tex
i stedet for pdftex filename.tex
producerer ikke en segfault.
Svar
LOLCODE, 4 byte
OBTW
Fungerer ikke kun online, kun 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 prøver på:
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Python-tolken er generelt svært at gå ned, men ovenstående er selektiv misbrug …
Svar
Frem – 3 tegn
0 @
(@
er en hentning)
Kommentarer
- Den hidtil korteste, der fungerer på moderne systemer.
- Hvilken fremtid? Gforth siger bare ” Ugyldig hukommelsesadresse ”
Svar
W32 .com eksekverbar – 0 byte
Dette ser underligt ud, men på 32 bit Windows-systemer kan oprettelse og udførelse af en tom .com-fil muligvis forårsage en segfault, afhængigt af … noget. DOS accepterer det bare (8086 har ingen hukommelsesadministration, der er ingen meningsfulde segmenter at fejl), og 64 bit Windows nægter at køre det (x86-64 har ingen v86-tilstand til at køre en .com-fil i).
Svar
C, 18
main(){raise(11);}
Kommentarer
- skal du tilføje #include < signal.h > i kodelisten?
- @FlorianCastellane: i C90 og lavere, for ethvert funktionsopkald udført uden en synlig erklæring, erklærer compileren implicit det som
int func()
. dvs. en funktion, der returnererint
, idet de tager uspecificerede parametre. I dette tilfælde erraise
en funktion, der returnerer int, tager et int-argument, så dette ordner sig (selvom compileren klager). - @Hasturkun
main(){main();}
Svar
Perl (< 5.14), 9 tegn
/(?{??})/
I 5.14 blev regex-motoren omdirigeret, så den ikke kunne styrte ned på denne måde, men 5.12 og tidligere vil segfault, hvis du prøver dette.
Kommentarer
- Jeg kan gengive dette på Perl 5.14 (Debian) og 5.18 (Arch Linux). sprunge.us/RKHT
- Gengivet med Perl v5.20.2 (windows)
- Hvad med
/(?R)/
på ældre Perl-versioner?
Svar
brainfuck (2)
<.
Ja, dette er implementeringsafhængigt. SIGSEGV er det sandsynlige resultat fra en god kompilator.
Kommentarer
- Hvordan er en kompilator, der adskiller sig fra den ” god “? At
<
enten ikke skal have nogen effekt eller vikle sig rundt. - Det er bedst at producere en runtime-fejl ved overskridelse af grænser, fordi det lader programmøren finde og rette fejlen hurtigst muligt. At lade buggy-programmet køre et stykke tid og ødelægge hukommelsen tilfældigt, før det går ned, gør bare problemet sværere at diagnosticere. At forhindre nedbruddet helt, som du antyder, er værst; programmøren kan få programmet ” til at arbejde ” og derefter blive ydmyget offentligt, når det går ned på standard compilere og tolke.
- Omvendt er det generelt ikke muligt at indhente overskridelser inden runtime og heller ikke særlig nyttigt i de tilfælde, hvor det er muligt. At producere en mere beskrivende runtime-fejl ville være okay, men at have operativsystemet til at fange det som en segfault er fantastisk, fordi det ikke ‘ ikke har nogen hastighedsomkostninger. (Hvis det ‘ ikke er klart, udfører selve compileren ikke ‘ t – det producerer eksekverbare filer, der segfault, så snart de prøver for at få adgang til hukommelse uden for grænserne.)
- Kan du give en implementering, der producerer denne adfærd og blev oprettet, før denne udfordring blev sendt? Hvis ikke, er dette svar ugyldigt.
- Grænsekontrol er implementeringsspecifik, så jeg ‘ er sikker på, at der er nogle, der kan fejle på det.Ville nogen SIGSEGV dog? Det tvivler jeg på. Der er dog et stort antal programmer, der afhænger af arrayindpakningen til venstre. Det kan være ret bekvemt at have dyrkbar lagerplads på begge sider.
Svar
Haskell, 31
foreign import ccall main::IO()
Dette giver en segfault, når den kompileres med GHC og køres. Ingen udvidelsesflag er nødvendige, da interface for udenlandske funktioner er i Haskell 2010-standarden.
Kommentarer
- Awwww. Jeg ville sende
import Foreign;main=peek nullPtr::IO Int
, men at ‘ s 40.
Svar
Bash, 4 byte
Golfet
. $0
Inkluder scriptet rekursivt i sig selv.
Forklaret
Rekursiv ” kilde ” (.) -handling medfører til sidst et stackoverløb, og da Bash ikke integreres med libsigsegv , dette resulterer i en SIGSEGV.
Bemærk, at dette ikke er en fejl, men en forventet adfærd, som diskuteret her .
Test
./bang Segmentation fault (core dumped)
Svar
Python 33
import os os.kill(os.getpid(),11)
Afsendelse af 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-versionen er:
*(int*)0=0;
Hele programmet (ikke helt ISO -overensstemmende, lad os antage, at det er K & RC) er 19 tegn lang:
main(){*(int*)0=0;}
Assembler variant:
orl $0,0
Hele programmet er 24 tegn (kun til evaluering, da det faktisk ikke er en samler):
main(){asm("orl $0,0");}
EDIT :
Et par C-varianter. Den første bruger nul initialisering af global pointervariabel:
*p;main(){*p=0;}
Den anden bruger uendelig rekursion:
main(){main();}
Den sidste variant er den korteste – 7 (15) tegn.
EDIT 2 :
Opfandt endnu en variant, der er kortere end nogen af ovenstående – 6 (14) tegn. Det forudsætter, at bogstavelige strenge sættes i et skrivebeskyttet segment.
main(){*""=0;}
EDIT 3 :
Og mit sidste forsøg – 1 tegn langt:
P
Bare kompilér det sådan :
cc -o segv -DP="main(){main();}" segv.c
Kommentarer
- i C isn ‘ t main; kun 5 charcters
- : Linker kontrollerer ikke ‘ t, om main er funktion eller ej. Det sendes bare til loader og returner sigsegv
- @FUZxxl I dette tilfælde er
main
en nul-initialiseret global int-variabel, så hvad vi får er et resultat af at prøve at udføre nogle nulbyte. I x86 er det ‘ d somadd %al,(%rax)
, hvilket er en perfekt gyldig instruktion, der forsøger at nå hukommelse på den adresse, der er gemt i%rax
. Chancerne for at have en god adresse der er minimale. - Selvfølgelig kan den sidste post bruges til alt, du skal bare angive de rigtige kompilatorargumenter. Hvilket skulle gøre det til den automatiske vinder af enhver kodegolfkonkurrence. 🙂
- Normalt tælles andre compiler-flag end dem, der vælger den sprogversion, der skal bruges, til det samlede tal.
Svar
Perl, 10/12 tegn
En let snydende løsning er at barbere en char af Joey Adams “bash trick :
kill 11,$$
For at få en reel segfault i Perl er unpack p
den oplagte løsning :
unpack p,1x8
Teknisk set er dette ikke garanteret til segfault, da adressen 0x31313131 (eller 0x31313131313131 på 64-bit-systemer) kan bare tilfældigt pege på gyldigt adresseområde. Men oddsene er imod det. Hvis perl nogensinde overføres til platforme, hvor pegepinde er længere end 64 bit, skal x8
øges.
Kommentarer
- Hvad er denne
1x8
ting? - @HannesKarppila Det ‘ er en kort vej til at skrive
"11111111".
Svar
dc – 7 tegn
[dx0]dx
forårsager et stackoverløb
Kommentarer
- Er værker, men kan du uddybe det? Hvorfor opfører det sig sådan?
-
[dx0]
gemmerdx0
på stakken, såd
duplikerer det øverste stakelement, såx
popper det øverste stakelement (dx0
) og udfører det. Hvilket duplikerer det øverste stakelement og begynder at udføre det …0
skal være der for at forhindre, at dette er et haleopkald, så de alle bygger op.
Svar
PicoLisp – 4 tegn
$ pil : ("0) Segmentation fault
Dette er beregnet adfærd. Som beskrevet på deres hjemmeside:
Hvis nogle programmeringssprog hævder at være “Swiss Army Knife of Programming”, så kan PicoLisp meget vel kaldes “Scalpel af programmering “: Skarp, nøjagtig, lille og let, men også farlig for de uerfarne.
Svar
F90 – 39 byte
real,pointer::p(:)=>null() p(1)=0. end
Kompilering:
gfortran segv.f90 -o segv
Udfø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
- Dejligt første indlæg.
Svar
Faktisk , 17 16 11 10 9 byte
⌠[]+⌡9!*.
Hvis ovenstående ikke går ned, prøv at øge antallet (flercifrede tal er angivet i Faktisk med et førende kolon )
Krasker fortolken r ved at udnytte en fejl i python , der involverer dybt indlejrede itertools.chain
objekter, som faktisk bruger til at implementere +
operatør.
Svar
OCaml, 13 byte
Obj.magic 0 0
Dette bruger funktionen Obj.magic
, som usikkert tvinger to typer. I dette tilfælde tvinger den 0 (gemt som den umiddelbare værdi 1 på grund af den tagbit, der bruges af GC), til en funktionstype (lagret som en markør). Således forsøger den at afvige adressen 1, og det vil naturligvis segfault.
Kommentarer
-
it coerces 0 (stored as the immediate value 1)
– hvorfor er 0 gemt som 1? - @Skyler se redigering
-
Obj.magic()0
er et tegn kortere 🙂
Svar
Pyth, 3 tegn
j1Z
Dette ville være den del, hvor jeg forklarede, hvordan jeg kom med dette svar, medmindre jeg legitimt har ingen anelse . Hvis nogen kunne forklare dette for mig, ville jeg være taknemmelig.
Forklaring
j
kvadrerer basen og kalder sig rekursivt, indtil basen er mindst lige så stor som tallet. Da basen er 0 , sker aldrig. Med en tilstrækkelig høj rekursionsgrænse får du en segfault.
Kommentarer
- Regnede noget ud! Fra at have gennemsøgt Pyth ‘ s kilde, fandt jeg, at denne kode
j
på1
og0
, som forsøger at konvertere1
til base0
. Hvorfor det ikke fungerer, har jeg ingen idé … - Se her .
j
kvadrerer basen og kalder sig rekursivt, indtil basen er mindst lige så stor som tallet. Da basen er 0 , sker det aldrig. Med en tilstrækkelig høj rekursionsgrænse får du en segfault. - @Dennis IDEone
- @SeeRhino The Pyth-tolk sætter rekursionsgrænsen til 100.000. I det mindste på TIO er ‘ nok til en segfault.
Svar
C # – 62
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
C # / usikker, 23 byte
unsafe{int i=*(int*)0;}
Af en eller anden grund forstår jeg ikke, *(int*)0=0
kaster bare en NullReferenceException, mens denne version giver den korrekte adgangsovertrædelse.
Kommentarer
-
int i=*(int*)0;
returnerer en NullReferenceException for mig. - Du kan prøve at få adgang til en negativ placering, f.eks.
*(int*)-1=0
og få adgangsovertrædelse. - Den særlige undtagelse er netop hvad clr pakker det ind og er ubetydeligt. Selve operativsystemet giver faktisk seg-fejlen i alle disse tilfælde.
- Årsagen til, at
*(int*)0=0
kaster en undtagelse, skyldes sandsynligvis optimering. Specifikt, for at undgå omkostningerne ved at kontrollerenull
, kan optimeringsprogrammet muligvis fjerne nulchecks, men når en segfault opstår, kan den muligvis omlægge den som en korrektNullReferenceException
.
Svar
19 tegn i C
main(a){*(&a-1)=1;}
Det ødelægger returadressens værdi for hovedfunktionen, så den får en SIGSEGV ved returnering af main
.
Kommentarer
- Det afhænger af stabelrammelayoutet, så i nogle arkitekturer kan det muligvis ikke mislykkes.
- Hvorfor ikke bare
main;
ellermain(){*""=0;}
? - @Sapphire_Brick
main;
er allerede givet i et andet svar. - @saeedn Så hvorfor poste det overhovedet? Denne er ikke ‘ t selv den næstkorte!
- @Sapphire_Brick På det tidspunkt, hvor jeg sendte min,
main;
var ikke ‘ ikke sendt, og jeg vidste ikke ‘ at det fungerer. Jeg påpegede kun, at den allerede er givet, og ikke noget formål at ændre mit svar. Desuden posterer folk her ‘ ikke kun for den korteste, nogle gange er en anden måde at løse problemet også interessant på.
Svar
Cython, 14
Dette er ofte nyttigt til fejlfindingsformål.
a=(<int*>0)[0]
Svar
J (6)
memf 1
memf
betyder ledig hukommelse, 1
fortolkes som en markør.
Kommentarer
- Hvorfor
1
i stedet for0
? Er det lovligt at frigøre en nul-markør i J?
Svar
Matlab – Ja det er muligt!
I et svar på et -spørgsmål til mig, kom Amro med denne finurlighed:
S = struct(); S = setfield(S, {}, "g", {}, 0)
Kommentarer
- Giv venligst Matlab-version – R2015B (og 2016B også) kaster bare en fejl: Fejl ved brug af setfield (linje 56) Mindst en indeks er påkrævet.
- @FlorianCastellane Kan ikke prøve alle versioner nu, men det er blevet bekræftet at give en segfault i nogle versioner, den seneste er 2014b og den tidligste 2012a.
Svar
C – 14 tegn
Sørg for at kompilere en tom fil med cc -nostartfiles c.c
Forklaring:
Hvad der gik galt er, at vi behandlede _start som om det var en C-funktion, og forsøgte at vende tilbage fra det. I virkeligheden er det slet ikke en funktion. Det er bare et symbol i objektfilen, som linkeren bruger til at lokalisere programmets indgangspunkt. Når vores program påberåbes, påkaldes det direkte. Hvis vi skulle se, ville vi se, at værdien på toppen af stakken var tallet 1, hvilket bestemt er meget un-adresse-lignende. Faktisk er det, der ligger på stakken, vores programs argc-værdi. Herefter kommer elementerne i argv-arrayet, inklusive det afsluttende NULL-element efterfulgt af elementerne i envp. Og det er alt sammen. Der er ingen returadresse på stakken.
Kommentarer
- I ‘ Jeg er ret sikker på at du skal score med de ekstra args
- Du skal tilføje 14 byte til det specielle flag.
- @ErikGolfer エ リ ッ ク ゴ フ ァ ー -nostartfiles is faktisk 13 byte lange 🙂
- @CharlesPaulet Jeg tror, du også skal tælle mellemrummet.
Svar
Unix PDP-11 samling, 18 bytes binær, 7 bytes kilde
(dette bliver et tema for mig, måske fordi det er det eneste sprog, jeg slags ved, at ingen- en anden her gør.)
inc(r0)
Øger den enkelte byte adresseret med den oprindelige værdi af r0 [som tilfældigvis er 05162 ifølge simh-fejlfindingsprogrammet] fra og med programstart.
0000000 000407 000002 000000 000000 000000 000000 000000 000000 0000020 005210 000000
Og som altid kan de fremmede bytes i slutningen fjernes med strip.
Jeg lavede et par forsøger at få kilden kortere, men endte altid med ge enten en syntaksfejl eller SIGBUS.