Lyhin koodi, joka herättää SIGSEGV: n

Kirjoita lyhin koodi, joka herättää segmentointivirheen (SIGSEGV) millä tahansa ohjelmointikielellä.

Kommentit

  • Vau. Ehkä lyhin onnistunut kysymys.
  • @MatthewRoh Kiinnostuksen vuoksi tein tämän SEDE-kyselyn. Näyttää siltä, että muutamia on +10 tai korkeampi, mutta tämä on ensimmäinen +40: n yläpuolella.

Vastaa

C, 5 merkkiä

main; 

Se on muuttujailmoitus – int -tyyppi oletetaan (ominaisuus kopioitu B-kieli) ja 0 on oletusarvo. Suoritettaessa tämä yrittää suorittaa luvun (numeroita ei voida suorittaa) ja aiheuttaa SIGSEGV .

Kokeile verkossa!

Kommentit

  • @Macmade: Itse asiassa se on 0. static -muuttujat alkavat 0, ja main; on static, kuten ilmoitin sen toiminnan ulkopuolelle. c-faq.com/decl/initval.html
  • kun viimeksi pelasin tällä jutulla, huomasin, että siellä ’ on eri syy segfaultille. Ensinnäkin kutsumalla main pääset siirtymään mainin sijaintiin, ei arvoon, toinen asia on main on int, se ’ .bss: ssä sijaitsevat toiminnot sijaitsevat yleensä .text -kohdassa, kun ydin lataa tonttuohjelman, jonka se luo suoritettavan sivun .text ja ei suoritettavissa tiedostolle .bss, joten kutsumalla main, siirryt sivulle, jota ei voida suorittaa, ja jotain tällaisella sivulla on suojausvirhe.
  • Jep, C-segmentin oletusarvot ovat melko oletusarvot: P
  • main __attribute__((section(".text#")))=0xc3; FTFY (ainakin näyttää siltä, että se palaa ilman kaatuu x86-laitteelleni).
  • @jozxyqk Tai lyhyempi, const main=195;. Kiinnostavaa on, että se ’ toimii, tämän koodigolfia koskevan haasteen tavoitteena oli saada koodi erottumaan, ei toimimaan :).

vastaus

Bash, 11            

kill -11 $$ 

Kommentit

  • Signaali 11 11 merkillä. Vaikuttaa oikeutetulta.
  • @ nyuszika7h aioin äänestää kommenttisi, mutta sinulla on tällä hetkellä 11 ääntä, joten ’ jätän sen siihen. : P
  • @AlexL. muut ihmiset näyttävät pilanneen sen 🙁
  • @theonlygusti Joo … Se ’ on liian huono. 🙁 No, niin voin äänestää sitä nyt .
  • Enintään 42 ääntä, ei kosketusta!

Vastaa

Assembly (Linux , x86-64), 1 tavu

RET 

Tämä koodi rikkoutuu.

Kommentit

  • MSDOS .com-tiedostona se toimii ja päättyy virheettömästi.
  • Tarkoitan: ”kokoonpanon” määrittäminen ei ole ’ riittävä tee siitä erottuva.
  • @JB: MS DOS: ssa mikään ohjelma ei koskaan tuota segmentointivirhettä. Tämä ’ s, koska MS DOS toimii todellisessa tilassa, jossa muistisuojausta ei ole.
  • @celtschk IIRC NTVDM katkaisee olemattomat osoitteet ja osoitteet, joita ei ole varattu MS-DOS: lle.
  • @celtschk: Voit silti rikkoa sen joka tapauksessa näin: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] – > CPU: n korotus s taustalla oleva SEGV (AFAIK siellä ’ ei kuitenkaan kukaan käsittele sitä).

Vastaa

Python 2, 13

exec"()"*7**6 

Windows ilmoittaa virhekoodin c00000fd (pinon ylivuoto), jonka oletan olevan alatyyppi segmentointivirhe.

Alex A.: n ja Megon ansiosta on vahvistettu aiheuttavan segmentointivirheitä myös Mac- ja Linux-järjestelmissä. Python on valitsemasi kieli ohjelmien kaatumiseen.

Kommentit

  • Segmentation fault: 11 Mac
  • Segmentation fault (core dumped) Linuxissa
  • Poistetaanko tämä ensin?
  • @MegaMan Kuten kestää kauan loppuun ? Ei, 7 ** 6 on vain noin 100 kt, joten ’ ei ole havaittavaa viivettä.
  • @MaxGasner Yritä lukea ohjelmointikieli uudelleen 🙂

Vastaa

pdfTeX ( 51)

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

Tämä on todennäköisesti vika , mutta sitä ei ole Knuthin kirjoittama alkuperäinen TeX: koodin kääntäminen tex filename.tex -merkillä pdftex filename.tex -kohdan sijaan ei tuota erottelua.

vastaus

LOLCODE, 4 tavua

OBTW 

Ei toimi verkossa, vain C-tulkissa.

Kommentit

  • LOL FANCY -KOODI M8 8/8 KTHXBYE

Vastaa

Python, 33 merkkiä

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

Lähde: http://bugs.python.org/issue1215#msg143236

Python, 60 merkkiä

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

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

Tämä on Python-versio n Testaukseni:

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

Yleensä Python-tulkkia on vaikea kaatua, mutta yllä oleva on selektiivistä väärinkäyttöä …

vastaus

neljäsosa – 3 merkkiä

0 @ 

(@ on haku)

Kommentit

  • Tähän mennessä lyhin, joka toimii nykyaikaisissa järjestelmissä.
  • Mikä Forth? Gforth sanoo vain ” Virheellinen muistiosoite ”

Vastaa

W32 .com-suoritettava – 0 tavua

Tämä tuntuu oudolta, mutta 32-bittisissä Windows-järjestelmissä tyhjän .com-tiedoston luominen ja suorittaminen saattaa aiheuttaa ristiriitaa riippuen … jostakin. DOS vain hyväksyy sen (8086: lla ei ole muistinhallintaa, ei ole merkityksellisiä segmenttejä), ja 64-bittinen Windows kieltäytyy suorittamasta sitä (x86-64, jolla ei ole v86-tilaa .com-tiedoston suorittamiseen).

vastaus

C, 18

main(){raise(11);} 

kommentit

  • sinun on lisättävä #include < signaali.h > koodiluetteloon?
  • @FlorianCastellane: C90: ssä ja sitä alemmissa versioissa kääntäjä ilmoittaa implisiittisesti kaikelle funktiokutsulle, joka on tehty ilman näkyvää ilmoitusta, int func(). ts. funktio, joka palauttaa int ja ottaa määrittelemättömät parametrit. Tässä tapauksessa raise on funktio, joka palauttaa int ja ottaa int-argumentin, joten tämä toimii (vaikka kääntäjä valittaisikin).
  • @Hasturkun main(){main();}

vastaus

Perl (< 5.14), 9 merkkiä

/(?{??})/ 

Kohdassa 5.14 regex-moottori saatettiin palaamaan, jotta sitä ei voida kaataa tällä tavalla, mutta 5.12 ja aikaisemmin erottelee, jos yrität tätä.

Kommentit

  • Voin toistaa tämän Perl 5.14: ssä (Debian) ja 5.18: ssa (Arch Linux). sprunge.us/RKHT
  • Palautettu Perl-versiolla 5.20.2 (Windows)
  • Entä /(?R)/ vanhemmissa Perl-versioissa?

Vastaa

brainfuck (2)

<. 

Kyllä, tämä on toteutuksesta riippuvainen. SIGSEGV on todennäköinen tulos hyvältä kääntäjältä.

Kommentit

  • Miten kääntäjä, joka rikkoo tämän ” hyvä ”? Sillä < ei pitäisi olla mitään vaikutusta tai kääritty.
  • Suorituksenaikaisen virheen välitön tuottaminen rajojen rikkomiseen on parasta, koska se antaa ohjelmoijan löytää ja korjata virheen mahdollisimman nopeasti. Antaen bugisen ohjelman ajaa jonkin aikaa ja vioittaa muistia sattumanvaraisesti ennen kaatumista, ongelman diagnosointi on vain vaikeampi. Kaatumisen estäminen kokonaan, kuten ehdotat, on pahinta; ohjelmoija voi saada ohjelman ” toimimaan ” ja sitten nöyryytetään julkisesti, kun se kaatuu vakiokoostajille ja tulkeille.
  • Päinvastoin, rikkomusten kiinni ottaminen ennen ajonaikaa ei ole yleensä mahdollista, eikä erityisen hyödyllistä tapauksissa, joissa se on mahdollista. Kuvailevamman ajonaikaisen virheen tuottaminen olisi kunnossa, mutta käyttöjärjestelmän saaminen kiinni segmenttivirheenä on hienoa, koska sillä ei ole ’ nopeuskustannuksia. (Jos ’ ei ole selvää, kääntäjä itse ei ole ’ t segfault – se tuottaa suoritettavia tiedostoja, jotka erottuvat heti, kun he yrittävät käyttää muistia rajojen ulkopuolella.)
  • Voitteko tarjota toteutuksen, joka tuottaa tämän käyttäytymisen ja joka luotiin ennen haasteen lähettämistä? Jos ei, tämä vastaus on virheellinen.
  • Rajatarkistukset ovat toteutuskohtaisia, joten olen ’ varma, että siinä on virheitä.Olisiko joku SIGSEGV? Epäilen sitä. On kuitenkin suuri määrä ohjelmia, jotka kuitenkin riippuvat vasemmalle järjestetystä taulukosta. Se voi olla melko kätevää, jos molemmilla puolilla on kasvatettavissa oleva tallennustila.

Vastaus

Haskell, 31

foreign import ccall main::IO() 

Tämä tuottaa segmenttivirheen, kun se käännetään GHC: llä ja suoritetaan. Laajennuslippuja ei tarvita, koska Foreign Function Interface on Haskell 2010 -standardissa.

Kommentit

  • Awwww. Kirjoitin import Foreign;main=peek nullPtr::IO Int, mutta se ’ s 40.

vastaus

Bash, 4 tavua

Golfed

 . $0  

Sisällytä komentosarja rekursiivisesti itseensä.

Selitetty

Rekursiivinen ” lähde ” (.) -toiminto aiheuttaa lopulta pinon ylivuotoa, ja koska Bash ei integroitu libsigsegv : n kanssa , tuloksena on SIGSEGV.

Huomaa, että tämä ei ole vika, vaan odotettu käyttäytyminen, kuten täällä käsitellään.

Testi

 ./bang Segmentation fault (core dumped)  

Kokeile online!

Vastaa

Python 33

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

Signaalin 11 (SIGSEGV) lähettäminen pythonissa.

Kommentit

  • Myös 33 merkkiä: from os import* ja kill(getpid(),11)

vastaus

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

C-versio on:

*(int*)0=0; 

Koko ohjelma (ei aivan ISO -yhteensopiva, olettakaamme sen oletettavan, että s K & RC) on 19 merkkiä pitkä:

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

Kokoaja muunnos:

orl $0,0 

Koko ohjelma on 24 merkkiä pitkä (vain arviointia varten, koska se ei itse asiassa ole kokoonpanija):

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

MUOKKAA :

Pari C-muunnosta. Ensimmäinen käyttää globaalin osoittimen muuttujan nolla-alustusta:

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

Toinen käyttää ääretöntä rekursiota:

main(){main();} 

Viimeinen muunnos on lyhin – 7 (15) merkkiä.

MUOKKAA 2 :

Keksi vielä yhden variantin, joka on lyhyempi kuin mikään yllä olevista – 6 (14) merkkiä. Siinä oletetaan, että kirjaimelliset merkkijonot asetetaan vain luku -segmenttiin.

main(){*""=0;} 

MUOKKAA 3 :

Ja viimeinen kokeiluni – 1 merkki pitkä:

P 

Käännä se vain tuolla tavalla :

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

Kommentit

  • C-isn ’ t main; vain 5 merkkiä
  • : Linker ei tarkista ’ t, onko päätoiminto vai ei. Se vain välittää sen lataaja ja paluu sigsegv>
  • @FUZxxl Tässä tapauksessa main on nolla-alustettu globaali int-muuttuja, joten mitä saamme, on tulos yrittää suorittaa joitain nolla tavua. X86: ssa se ’ d on jotain add %al,(%rax), joka on täysin kelvollinen käsky, joka yrittää päästä muistiin osoitteeseen, joka on tallennettu osoitteeseen %rax. Mahdollisuudet hyvään osoitteeseen ovat vähäiset.
  • Viimeistä merkintää voidaan tietysti käyttää kaikkeen, sinun tarvitsee vain antaa oikeat kääntäjän argumentit. Tämän pitäisi tehdä siitä minkä tahansa koodigolfkilpailun automaattinen voittaja. 🙂
  • Yleensä muut kääntäjän liput kuin ne, jotka valitsevat käytettävän kieliversion, lasketaan kokonaismäärään.

Vastaa

Perl, 10/12 merkkiä

Hieman huijaava ratkaisu on ajaa yksi hiili pois Joey Adams ”bash-temppu :

kill 11,$$ 

Oikean segfaultin saamiseksi Perlistä unpack p on kuitenkin ilmeinen ratkaisu :

unpack p,1x8 

Teknisesti tätä ei ”taata segfaultille, koska osoite 0x31313131 (tai 0x3131313131313131 64-bittisissä järjestelmissä) vain saattaa osoittaa kelvolliseen osoitetilaan sattumalta. Mutta kertoimet ovat sitä vastaan. Jos myös perl-portti siirretään koskaan alustoille, joissa osoittimet ovat yli 64-bittisiä, x8 -ominaisuutta on lisättävä.

Kommentit

  • Mikä tämä 1x8 on?
  • @HannesKarppila Se ’ on lyhyt tapa kirjoittaa "11111111".

vastaus

dc – 7 merkkiä

[dx0]dx 

aiheuttaa pinon ylivuotoa

Kommentit

  • Onko teoksia, mutta voitko kertoa tarkemmin? Miksi se käyttäytyy niin?
  • [dx0] tallentaa dx0 pinoon, sitten d kopioi ylimmän pinon elementin, sitten x ponnahtaa ylimmän pinon elementin (dx0) ja suorittaa sen. Mikä kopioi ylimmän pinon elementin ja aloittaa sen suorittamisen … 0 on oltava paikalla estääkseen tämän hännän kutsun, joten ne kaikki muodostuvat.

vastaus

PicoLisp – 4 merkkiä

$ pil : ("0) Segmentation fault 

Tämä on tarkoitettu käyttäytyminen. Kuten heidän verkkosivustollaan on kuvattu:

Jos jotkut ohjelmointikielet väittävät olevansa ”Sveitsin armeijan ohjelmointiveitsi”, PicoLispiä voidaan hyvinkin kutsua ”Scalpeliksi” ”: Terävä, tarkka, pieni ja kevyt, mutta vaarallinen myös kokematon käsissä.

Vastaa

F90 – 39 tavua

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

Kokoelma:

gfortran segv.f90 -o segv 

Suoritus:

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

Materiaalit:

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

kommentit

  • Hyvä ensimmäinen viesti.

Vastaa

Oikeastaan , 17 16 11 10 9 tavua

⌠[]+⌡9!*. 

Kokeile online!

Jos yllä oleva ei kaatu, yritä lisätä lukumäärää (moninumeroiset numerot määritetään kohdassa Oikeastaan johtavalla kaksoispisteellä )

Kaataa tulkinnan r hyödyntämällä virhettä pythonissa , johon liittyy syvästi sisäkkäisiä itertools.chain -objekteja, jota itse asiassa käytetään + -operaattori.

Vastaa

OCaml, 13 tavua

Obj.magic 0 0 

Tässä käytetään funktiota Obj.magic, joka pakottaa turvallisesti kahta tyyppiä. Tässä tapauksessa se pakottaa 0 (tallennetaan välittömänä arvona 1 johtuen GC: n käyttämästä tagibitistä) toimintotyypiksi (tallennetaan osoittimena). Siksi se yrittää jättää huomiotta osoitteen 1, ja se tietysti erottelee.

Kommentit

  • it coerces 0 (stored as the immediate value 1) – miksi 0 on tallennettu 1: ksi?
  • @Skyler see edit
  • Obj.magic()0 on yhden merkin lyhyempi 🙂

Vastaus

Pyth, 3 merkkiä

j1Z 

Tässä osassa selitän, miten sain vastauksen, paitsi että minulla ei laillisesti ole aavistustakaan . Jos joku voisi selittää tämän minulle, olisin kiitollinen.

Tässä se on online-tulkissa.

Selitys

j neliö kantaa ja kutsuu itseään rekursiivisesti, kunnes tukiasema on vähintään yhtä suuri kuin numero. Koska pohja on 0 , ei koskaan tapahdu. Riittävän korkealla rekursiorajalla saat segfaultin.

Dennis ♦

kommentit

  • Selvitin jotain! Selaamalla Pyth ’ -lähdettä huomasin, että tämä koodi j 1

, jotka yrittävät muuntaa1pohjaksi0. Miksi se rikkoutuu, minulla ei ole idea …

  • Katso täältä . j neliö tukiaseman ja kutsuu itseään rekursiivisesti, kunnes tukiasema on vähintään yhtä suuri kuin numero. Koska tukikohta on 0 , sitä ei koskaan tapahdu. Riittävän korkealla rekursiorajalla saat segmentin.
  • @Dennis IDEone
  • @SeeRhino Pyth-tulkki asettaa rekursiorajaksi 100 000. Ainakin TIO: ssa tämä ’ riittää segfaultille.
  • Vastaa

    C # – 62

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

    C # / vaarallinen, 23 tavua

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

    Jostain syystä en ymmärrä, *(int*)0=0 vain heittää NullReferenceExceptionin, kun taas tämä versio antaa asianmukaisen käyttöoikeusrikkomuksen.

    Kommentit

    • int i=*(int*)0; palauttaa minulle NullReferenceException-arvon.
    • Voit yrittää käyttää negatiivista sijaintia, kuten *(int*)-1=0, ja saada käyttöoikeusrikkomus.
    • Erityinen poikkeus on juuri se, mitä clr kääri sen sisään ja on merkityksetön. Itse käyttöjärjestelmä antaa seg-vian kaikissa näissä tapauksissa.
    • Syy *(int*)0=0 heittää poikkeuksen johtuu todennäköisesti optimoinnista. Tarkemmin sanoen, jotta vältetään null -tarkistuskustannukset, optimoija voi poistaa tyhjät tarkistukset, mutta kun esiintyy erottelua, se voi heittää sen uudelleen oikeina NullReferenceException.

    vastaus

    19 merkkiä C-muodossa

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

    Se vahingoittaa pääfunktion paluuosoitearvoa, joten se saa SIGSEGV: n palautettaessa main.

    Kommentit

    • Se riippuu pinokehyksen asettelusta, joten se ei joissakin arkkitehtuureissa voi epäonnistua.
    • Miksi ei yksinkertaisesti main; tai main(){*""=0;}?
    • @Sapphire_Brick main; on jo annettu toisessa vastauksessa.
    • @saeedn Miksi sitten lähettää sen ollenkaan? Tämä ei ole ’ edes toiseksi lyhyin!
    • @Sapphire_Brick Siihen aikaan kun lähetin minun, main; ei ollut ’ t lähetetty, enkä ’ tiennyt, että se toimii. Olin vain huomauttanut, että se on jo annettu, eikä mitään syytä muuttaa vastaustani. Lisäksi täällä olevat ihmiset eivät ’ t vain lähetä viestejä vain lyhyimmäksi ajaksi, joskus myös erilainen tapa ratkaista ongelma on mielenkiintoinen.

    Vastaa

    Cython, 14

    Tämä on usein hyödyllistä virheenkorjauksessa.

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

    vastaus

    J (6)

    memf 1 

    memf tarkoittaa vapaata muistia, 1 tulkitaan osoittimena.

    Kommentit

    • Miksi 1 kuin 0? Onko nollan osoittimen vapauttaminen J: ssä laillista?

    Vastaa

    Matlab – Kyllä, se on mahdollista!

    Vastauksessaan kysymykseeni Amro keksi tämän oivalluksen:

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

    kommentit

    • Anna Matlab-versio – R2015B (ja myös 2016B) heittää vain virheen: Virhe asetuskentän käytössä (rivi 56) Ainakin yksi Hakemisto vaaditaan.
    • @FlorianCastellane Ei pysty kokeilemaan kaikkia versioita nyt, mutta on vahvistettu antavan segfaultin joissakin versioissa, viimeisin on 2014b ja aikaisin 2012a.

    Vastaa

    C – 14 merkkiä

    Muista koota tyhjä tiedosto cc -nostartfiles c.c

    Selitys:

    Menee pieleen se, että käsiteltiin _startia kuin C-funktiota, ja yritti palata siitä. Todellisuudessa se ei ole lainkaan toiminto. Se on vain symboli objektitiedostossa, jota linkkijä käyttää etsimään ohjelman lähtökohdan. Kun ohjelmaamme kutsutaan, se kutsutaan suoraan. Jos etsimme, näisimme, että pinon yläosassa oleva arvo oli numero 1, joka on varmasti hyvin osoitteen kaltainen. Itse asiassa pino on ohjelmamme argc-arvo. Tämän jälkeen tulevat argv-taulukon elementit, mukaan lukien päättyvä NULL-elementti, jota seuraavat envp-elementit. Ja kaikki. Pinoa ei ole palautusosoitetta.

    Kommentit

    • I ’ olen melko varma, että sinun täytyy pisteyttää ylimääräisillä argumenteilla
    • Sinun on lisättävä 14 tavua erikoislippua varten.
    • @ErikGolfer エ リ ッ ク ゴ ル フ ァ ー -nostartfiles on oikeastaan 13 tavua pitkä 🙂
    • @CharlesPaulet Mielestäni sinun on myös laskettava tila.

    Vastaa

    Unix PDP-11 -kokoonpano, 18 tavua binääriä, 7 tavua lähde

    (tästä on tulossa teema minulle, ehkä siksi, että se on ainoa kieli, jonka tiedän tavallaan, että ei yksi muu täällä.)

    inc(r0) 

    Lisää yhden tavun osoitettua aloitusarvoa r0 [joka simh-virheenkorjaimen mukaan sattuu olemaan 05162] alkaen ohjelman aloitus.

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

    Ja kuten aina, lopussa olevat ulkopuoliset tavut voidaan poistaa nauhoilla.

    Tein muutaman yrittää saada lähteen lyhyemmäksi, mutta päätyi aina ge joko syntaksivirhe tai SIGBUS.

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *