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
.
Kommentit
- @Macmade: Itse asiassa se on
0
.static
-muuttujat alkavat0
, jamain;
onstatic
, 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 palauttaaint
ja ottaa määrittelemättömät parametrit. Tässä tapauksessaraise
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)
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*
jakill(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 jotainadd %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]
tallentaadx0
pinoon, sittend
kopioi ylimmän pinon elementin, sittenx
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!*.
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.
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.
kommentit
- Selvitin jotain! Selaamalla Pyth ’ -lähdettä huomasin, että tämä koodi
j
1
, jotka yrittävät muuntaa1
pohjaksi0
. Miksi se rikkoutuu, minulla ei ole idea …
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. 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äännull
-tarkistuskustannukset, optimoija voi poistaa tyhjät tarkistukset, mutta kun esiintyy erottelua, se voi heittää sen uudelleen oikeinaNullReferenceException
.
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;
taimain(){*""=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
kuin0
? 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.