Korteste kode, der rejser en SIGSEGV

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 .

Prøv det online!

Kommentarer

  • @Macmade: Det er faktisk 0. static variabler starter som 0, og main; er static, 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 returnerer int, idet de tager uspecificerede parametre. I dette tilfælde er raise 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)  

Prøv det online!

Svar

Python 33

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

Afsendelse af 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-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 som add %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] gemmer dx0 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!*. 

Prøv det online!

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.

Her er det i en online tolk.

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.

Dennis ♦

Kommentarer

  • Regnede noget ud! Fra at have gennemsøgt Pyth ‘ s kilde, fandt jeg, at denne kode j1 og 0, som forsøger at konvertere 1 til base 0. 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 kontrollere null, kan optimeringsprogrammet muligvis fjerne nulchecks, men når en segfault opstår, kan den muligvis omlægge den som en korrekt NullReferenceException.

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *