A legrövidebb kód, amely felvet egy SIGSEGV

Írja be a legrövidebb kódot, amely felvet egy szegmentálási hibát (SIGSEGV) bármely programozási nyelven.

Megjegyzések

  • Hú. Esetleg a legrövidebb sikeres kérdés.
  • @MatthewRoh Érdeklődésből ezt a SEDE lekérdezést készítettem. Úgy tűnik, hogy van néhány, +10 vagy annál magasabb, de ez az első a +40 felett

Válasz

C, 5 karakter

main; 

Ez egy változó deklaráció – int típus implicit (a szolgáltatásról másolva B nyelv) és a 0 az alapértelmezett érték. A végrehajtáskor megpróbál végrehajtani egy számot (a számok nem futtathatóak), és SIGSEGV .

Próbálja ki online!

Megjegyzések

  • @Macmade: Valójában ez 0. A static változók 0 néven kezdődnek, a main; pedig static, amint azt kívülről kinyilvánítottam. c-faq.com/decl/initval.html
  • amikor utoljára játszottam ezzel a dologgal, rájöttem, hogy ott ' a szegfault különböző oka. Először a main hívásával ugrik a main helyre, nem pedig az értékre, egy másik dolog a main egy int, ez ' s a .bss helyen találhatók, a függvények általában a .text helyen találhatók, amikor a kernel betölti az elf programot, futtatható oldalt hoz létre a .text és nem futtatható a .bss fájlhoz, tehát a main meghívásával egy nem futtatható oldalra ugrik, és egy ilyen oldalon végrehajtott valami egy védelmi hiba.
  • Igen, a C-ben található alapértelmezett beállítások nagyjából az alapértelmezettek: P
  • main __attribute__((section(".text#")))=0xc3; FTFY (legalábbis úgy tűnik, hogy visszatér összeomlik az x86-on).
  • @jozxyqk Vagy rövidebb, const main=195;. Érdekesség, hogy ' működik, ennek a golf golf kihívásnak az volt a célja, hogy a kódot segfultivá tegye, ne pedig működjön :). div>

    Válasz

    Bash, 11            

    kill -11 $$ 

    Megjegyzések

    • 11. jel 11 karakterben. Legitikusnak tűnik.
    • @ nyuszika7h Meg akartam szavazni a megjegyzésedet, de jelenleg 11 pozitív szavazatod van, úgyhogy ' ezt hagyom. : P
    • @AlexL. úgy tűnik, hogy más emberek ezt elrontották 🙁
    • @theonlygusti Igen … Ez ' s nagyon rossz. 🙁 Na, akkor most fel tudom szavazni .
    • Legfeljebb 42 pozitív szavazat, nincs érintett!

    Válasz

    Összeállítás (Linux , x86-64), 1 bájt

    RET 

    Ez a kód megszakad.

    Megjegyzések

    • MSDOS .com fájlként hiba nélkül fut és véget ér.
    • Lényegem: az „assembly” megadása csak ' nem elég ahhoz, hogy váljon szegfúttá.
    • @JB: MS DOS-on a egyetlen program sem soha hoz létre szegmentálási hibát. Ez ' s, mert az MS DOS valós módban fut, ahol a memória védelme nem létezik.
    • A @celtschk IIRC NTVDM a nem létező címeken és az MS-DOS-hoz nem hozzárendelt címeken is megjelenik.
    • @celtschk: Különben is megkülönböztetheted: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] – > CPU emelés s az alapul szolgáló SEGV (AFAIK ott ' senki sem kezeli).

    Válasz

    Python 2, 13

    exec"()"*7**6 

    A Windows a c00000fd (Stack Overflow) hibakódját jelenti, amely feltételezem, hogy a szegmentálási hiba.

    Alex A. és Mego jóvoltából megerősítést nyert, hogy szegmentálási hibákat okoz Mac és Linux rendszereken is. A Python a kiválasztott nyelv a programok hordozható összeomlásához.

    Megjegyzések

    • Segmentation fault: 11 Mac
    • Segmentation fault (core dumped) Linuxon
    • Ez előbb leteszi?
    • @MegaMan As hosszú időbe telik ? Nem, a 7 ** 6 csak kb. 100 000, tehát ' nincs érzékelhető késés.
    • @MaxGasner Próbálja újra elolvasni a programozási nyelvet 🙂

    Válasz

    pdfTeX ( 51)

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

    Ez valójában valószínűleg hiba , de nincs benne az eredeti TeX, amelyet Knuth írt: a pdftex filename.tex helyett a tex filename.tex kód összeállítása nem eredményez szegfaultot.

    Válasz

    LOLCODE, 4 bájt

    OBTW 

    Nem működik online, csak a C tolmácsban.

    Megjegyzések

    • LOL FANCY KÓD M8 8/8 KTHXBYE

    Válasz

    Python, 33 karakter

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

    Forrás: http://bugs.python.org/issue1215#msg143236

    Python, 60 karakter

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

    Forrás: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup

    Ez a Python verzió n Tesztelek a következőn:

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

    Általában a Python tolmács nehezen összeomlik, de a fentiek szelektív visszaélések …

    Válasz

    Negyedik – 3 karakter

    0 @ 

    (@ egy lekérés)

    Megjegyzések

    • Eddig a legrövidebb, amely a modern rendszereken működik.
    • Melyik Forth? Gforth csak annyit mond, hogy " Érvénytelen memóriacím "

    Válasz

    W32 .com futtatható – 0 bájt

    Ez furcsának tűnik, de 32 bites Windows rendszereken egy üres .com fájl létrehozása és végrehajtása lehet szétesést okoznak, attól függően, hogy … valami. A DOS csak elfogadja (a 8086 nem rendelkezik memóriakezeléssel, nincsenek értelmes szegmensek), és a 64 bites Windows nem hajlandó futtatni (x86-64 nem rendelkezik v86 móddal .com fájl futtatásához).

    Válasz

    C, 18

    main(){raise(11);} 

    Megjegyzések

    • hozzá kell adnia a #include < signal.h > kódot a kódlistában?
    • @FlorianCastellane: a C90 vagy annál alacsonyabb verzióban minden látható deklaráció nélkül végrehajtott függvényhíváshoz a fordító implicit módon int func() néven deklarálja. azaz egy olyan funkció, amely int -vel tér vissza, meghatározatlan paramétereket vesz fel. Ebben az esetben a raise egy függvény, amely int-t ad vissza, egy int argumentumot vesz fel, így ez sikerül (még akkor is, ha a fordító panaszkodik).
    • @Hasturkun main(){main();}

    Válasz

    Perl (< 5.14), 9 karakter

    /(?{??})/ 

    5.14-ben a regex motort újra bejárattá tették, hogy így ne lehessen összeomlani, de 5.12 és A korábbi szegfault, ha megpróbálja ezt.

    Megjegyzések

    • Ezt meg tudom reprodukálni a Perl 5.14 (Debian) és 5.18 (Arch Linux) rendszereken. sprunge.us/RKHT
    • reprodukálva a Perl v5.20.2 verzióval (Windows)
    • Mi a helyzet a /(?R)/ a régebbi Perl verziókon?

    Válasz

    brainfuck (2)

    <. 

    Igen, ez megvalósítástól függ. A SIGSEGV egy jó fordító valószínű eredménye.

    Megjegyzések

    • Hogyan működik az a fordító, amelyik elválasztja ezt az " jó "? Ennek a < -nek vagy nincs hatása, vagy körbefut.
    • A futásidejű hiba azonnali előállítása a korlátok megsértése esetén, mert lehetővé teszi a programozó számára, hogy a hibát a a lehető leggyorsabban. Ha hagyja, hogy a hibás program egy ideig fusson, és a memória véletlenszerűen megsérüljön, mielőtt összeomlik, a probléma diagnosztizálása csak nehezebbé válik. A baleset teljes megelőzése, amint azt javasolja, a legrosszabb; a programozó elérheti, hogy a " program " működjön, majd nyilvánosan megalázzák, amikor összeomlik a szabványos fordítókon és tolmácsokon.
    • Ezzel szemben a határsértések lefutása futásidő előtt általában nem lehetséges, és különösen nem hasznos azokban az esetekben, amikor ez lehetséges. Leíróbb futásidejű hiba előállítása rendben lenne, de nagyszerű, ha az operációs rendszer segfaultként fogja el, mert nincs ' ennek sebességköltsége. (Ha ' nem világos, a fordító maga nem ' t szegfault – futtatható fájlokat állít elő, amelyek azonnal megszakadnak, amint megpróbálják hogy korlátlanul férhessen hozzá a memóriához.)
    • Tudna-e olyan megvalósítást biztosítani, amely előidézi ezt a viselkedést, és amelyet a kihívás közzététele előtt hoztak létre? Ha nem, akkor ez a válasz érvénytelen.
    • A határellenőrzések végrehajtásspecifikusak, ezért ' biztos vagyok benne, hogy vannak olyanok, amelyek hibáznának rajta.Bármilyen SIGSEGV lenne? Kétlem. Számos olyan program létezik, amelyek attól függenek, hogy a tömb balra van-e tekerve. Meglehetősen kényelmes lehet, ha mindkét oldalon megnő a tárhely.

    Válasz

    Haskell, 31

    foreign import ccall main::IO() 

    Ez egy szegfaultot eredményez, amikor GHC-vel fordítják és futtatják. Nincs szükség kiterjesztési jelzőkre, mivel a Foreign Function Interface a Haskell 2010 szabványnak felel meg.

    Megjegyzések

    • Awwww. import Foreign;main=peek nullPtr::IO Int -t tettem közzé, de ez ' 40-et.

    Válasz

    Bash, 4 bájt

    Golfed

     . $0  

    Rekurzívan tartalmazza a szkriptet magában.

    Megmagyarázva

    Rekurzív " forrás " (.) művelet végül verem túlcsordulást okoz, és mivel a Bash nem integrálódik a libsigsegv , ez SIGSEGV-t eredményez.

    Ne feledje, hogy ez nem hiba, hanem várható viselkedés, amiről itt beszéltünk.

    Teszt

     ./bang Segmentation fault (core dumped)  

    Próbálja ki online!

    Válasz

    Python 33

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

    11. jel (SIGSEGV) küldése a pythonban.

    Megjegyzések

    • Szintén 33 karakter: from os import* és kill(getpid(),11)

    Válasz

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

    A C verzió:

    *(int*)0=0; 

    Az egész program (nem egészen ISO – kompatibilis, tegyük fel, hogy K & RC) 19 karakter hosszú:

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

    Összeszerelő variáns:

    orl $0,0 

    Az egész program 24 karakter hosszú (csak kiértékelés céljából, mivel valójában nem összeállító):

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

    SZERKESZTÉS :

    Pár C változat. Az első a globális mutatóváltozó nulla inicializálását használja:

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

    A második végtelen rekurziót használ:

    main(){main();} 

    Az utolsó változat a legrövidebb – 7 (15) karakter.

    2. SZERKESZTÉS :

    Talált ki még egy változatot, amely rövidebb, mint bármelyik fenti – 6 (14) karakter. Feltételezi, hogy a szó szerinti karakterláncok csak olvasható szegmensbe kerülnek.

    main(){*""=0;} 

    EDIT 3 :

    És az utolsó próbálkozásom – 1 karakter hosszú:

    P 

    Csak fordítsd le így :

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

    Megjegyzések

    • a C isn ' t main; csak 5 karakter
    • : A linker nem ' nem ellenőrzi, hogy a main függvény-e vagy sem. Csak továbbítja a betöltő és a visszatérés sigsegv
    • @FUZxxl Ebben az esetben a main egy nulla inicializált globális int változó, tehát amit kapunk, nulla bájt végrehajtásának kísérlete. Az x86-ban ' d valami olyasmi lehet, mint add %al,(%rax), amely tökéletesen érvényes utasítás, amely megpróbálja elérni a memóriát a %rax. A jó cím megadásának esélye minimális.
    • Természetesen az utolsó bejegyzés mindenre használható, csak meg kell adnia a megfelelő fordítói argumentumokat. Ennek köszönhetően minden kódgolf-verseny automatikus győztese lehet. 🙂
    • Általában a fordítói jelzők, amelyek nem a használni kívánt nyelvi verziót választják, beleszámítanak az összesbe.

    Válasz

    Perl, 10/12 karakter

    Kicsit csaló megoldás az, ha egy szálat leborotvál Joey Adams “bash trükk :

    kill 11,$$ 

    Ahhoz azonban, hogy valódi segfaultot kapjunk a Perl-ben, a unpack p a kézenfekvő megoldás. :

    unpack p,1x8 

    Technikailag ez nem arantált a szegfaultnak, mivel a cím 0x31313131 (vagy 0x3131313131313131 64 bites rendszereken) csak véletlenül mutathat érvényes címtérre. De az esélyek ellene vannak. Továbbá, ha a perl valaha olyan platformokra kerül, ahol a mutatók 64 bitnél hosszabbak, akkor a x8 -et meg kell növelni.

    Megjegyzések

    • Mi ez a 1x8 dolog?
    • @HannesKarppila ' egy rövid írásmódja "11111111".

    Válasz

    dc – 7 karakter

    [dx0]dx 

    verem túlcsordulást okoz

    Megjegyzések

    • Művek, de tudnád részletezni? Miért viselkedik így?
    • [dx0] dx0 tárolja a veremben, majd d lemásolja a legfelső verem elemet, majd a x feldobja a felső verem elemet (dx0) és végrehajtja. Ami lemásolja a legfelső verem elemet, és elkezdi végrehajtani … A 0 -nek ott kell lennie, hogy megakadályozza, hogy ez farokhívás legyen, tehát mind felépülnek.

    Válasz

    PicoLisp – 4 karakter

    $ pil : ("0) Segmentation fault 

    Ez szándékolt viselkedés. Amint azt a honlapjukon leírták:

    Ha egyes programozási nyelvek a “svájci hadsereg programozási késének” vallják magukat, akkor a PicoLisp-et “szikének” is nevezhetjük. programozás “: Éles, pontos, kicsi és könnyű, de veszélyes a tapasztalatlanok kezében is.

    Válasz

    F90 – 39 bájt

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

    Összeállítás:

    gfortran segv.f90 -o segv 

    Végrehajtás:

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

    Anyagok:

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

    Megjegyzések

    • Szép első bejegyzés.

    Válasz

    Valójában , 17 16 11 10 9 bájt

    ⌠[]+⌡9!*. 

    Próbálja ki online!

    Ha a fentiek nem ütköznek össze, próbálja meg növelni a számot (a többjegyű számokat a Tulajdonképpen egy vezető kettőspont adja meg )

    Összeomlik az értelmező r azáltal, hogy kihasználja a hibát a pythonban , amely mélyen egymásba ágyazott itertools.chain objektumokat tartalmaz, amelyek valójában a + operátor.

    Válasz

    OCaml, 13 bájt

    Obj.magic 0 0 

    Ez a Obj.magic függvényt használja, amely biztonságosan kényszerít bármely két típust. Ebben az esetben a 0-t (az 1. közvetlen értékként tárolva, a GC által használt címke bit miatt) egy funkciótípusra kényszeríti (mutatóként tárolva). Így megpróbálja elvetni az 1. címet, és ez természetesen meg fog szaggatni.

    Megjegyzések

    • it coerces 0 (stored as the immediate value 1) – miért van 0 tárolva 1-ként?
    • @Skyler lásd a szerkesztést
    • Obj.magic()0 egy karakterrel rövidebb 🙂

    Válasz

    Pyth, 3 karakter

    j1Z 

    Ez lenne az a rész, ahol elmagyarázom, hogyan jutottam erre a válaszra, kivéve, ha jogosan nincs sejtésem . Ha valaki elmagyarázná ezt nekem, hálás lennék.

    Itt van egy online tolmácsban.

    Magyarázat

    j négyzetre emeli az alapot, és rekurzívan hívja magát, amíg az alap legalább akkora lesz, mint a szám. Mivel az alap 0 , Soha nem történik meg. Megfelelően magas rekurziós korlát mellett egy szegfaultot kapsz.

    Dennis ♦

    Megjegyzések

    • Kitaláltam valamit! A Pyth ' s forrás böngészéséből kiderült, hogy ez a kód j a 1 és 0, amely megpróbálja átalakítani a 1 bázissá 0. Miért hibásodik meg, nincs ötlet …
    • Lásd itt . j négyzetre állítja az alapot, és rekurzívan hívja magát, amíg az alap legalább akkora lesz, mint a szám. Mivel a bázis 0 , ez soha nem történik meg. Megfelelően magas rekurziós korlát mellett egy szegfaultot kap.
    • @Dennis IDEone
    • @SeeRhino A Pyth tolmács a rekurziós határt 100 000-re állítja. Legalább a TIO-n ez ' elegendő egy szegfault számára.

    Válasz

    C # – 62

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

    C # / nem biztonságos, 23 bájt

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

    Valamilyen oknál fogva nem értem, a *(int*)0=0 csak egy NullReferenceExceptiont dob, míg ez a verzió biztosítja a megfelelő hozzáférés megsértését.

    Megjegyzések

    • A int i=*(int*)0; egy NullReferenceException számot ad vissza.
    • Megpróbálhat elérni egy negatív helyet, például *(int*)-1=0, és hozzáférési jogsértést kaphat.
    • A konkrét kivétel csak az, amit a clr beburkolja, és jelentéktelen. Maga az os valójában ezekben az esetekben adja meg a seg hibát.
    • Az oka, hogy *(int*)0=0 kivételt vet, valószínűleg az optimalizálásnak köszönhető. Pontosabban, a null ellenőrzésének költségeinek elkerülése érdekében az optimalizáló törölheti az érvénytelen ellenőrzéseket, de ha szegfaultum fordul elő, akkor megfelelő NullReferenceException.

    Válasz

    19 karakter C-ben

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

    Megrontja a fő függvény visszatérési címének értékét, így SIGSEGV-t kap a main visszatérésekor.

    Megjegyzések

    • Ez a veremkeret elrendezésétől függ, ezért bizonyos architektúrákban ez valószínűleg nem fog kudarcot vallani.
    • Miért nem egyszerűen main;, vagy main(){*""=0;}?
    • @Sapphire_Brick main; már meg van adva egy másik válaszban.
    • @saeedn Akkor miért kell egyáltalán közzé tenni? Ez még ' még a második sem a legrövidebb!
    • @Sapphire_Brick Abban az időben, amikor az enyémet postáztam, main; nem volt ' t közzétéve, és nem tudtam, hogy ' tudtam-e, hogy működik. Csak rámutattam, hogy ez már adott, és nincs értelme változtatni a válaszomon. Továbbá az itt élők nem ' csak a legrövidebb időn belül tesznek közzé üzenetet, néha a probléma megoldásának más módja is érdekes.

    Válasz

    Cython, 14

    Ez gyakran hasznos hibakeresés céljából.

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

    Válasz

    J (6)

    memf 1 

    memf szabad memóriát jelent, a 1 mutatóként értelmezhető.

    Megjegyzések

    • Miért 1, nem pedig 0? Jogszerű-e null mutatót felszabadítani J-ben?

    Válasz

    Matlab – Igen, lehetséges!

    Amint egy kérdésre válaszolt, Amro előállt ezzel a furcsasággal:

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

    Megjegyzések

    • Adja meg a Matlab verziót – az R2015B (és a 2016B is) csak hibát dob: Hiba a setfield használatakor (56. sor) Legalább egy index szükséges.
    • @FlorianCastellane Nem tudja most kipróbálni az összes verziót, de bebizonyosodott, hogy meglehetősen sok változatban ad meg egy segfaultot, a legújabb a 2014b és a legkorábbi a 2012a.

    Válasz

    C – 14 karakter

    Ügyeljen arra, hogy egy üres fájlt fordítson a következővel: cc -nostartfiles c.c

    Magyarázat:

    Ami rosszul esett, az az, hogy a _start-ot úgy kezeltük, mintha egy C függvény lenne, és megpróbált visszatérni onnan. A valóságban ez egyáltalán nem függvény. Ez csak egy szimbólum az objektumfájlban, amelyet a linker a program belépési pontjának megkeresésére használ. Amikor a programunkat meghívjuk, közvetlenül meghívjuk. Ha megnéznénk, látnánk, hogy a verem tetején az érték az 1-es szám volt, ami bizony nagyon cím nélküli. Valójában ami a veremben van, az a program argc értéke. Ezután következnek az argv tömb elemei, beleértve a befejező NULL elemet, majd az envp elemei. És ez minden. Nincs visszatérési cím a veremben.

    Megjegyzések

    • I ' nagyon biztos, hogy gólt kell szerezned a további argokkal
    • 14 bájtot kell hozzáadnod a speciális zászlóhoz.
    • @ErikGolfer エ リ ッ ク ゴ ル フ ァ ー -nostartfiles is valójában 13 bájt hosszú 🙂
    • @CharlesPaulet szerintem neked is meg kell számolnod a teret.

    Válasz

    Unix PDP-11 összeállítás, 18 bájtos bináris, 7 bájtos forrás

    (ez velem egy téma, talán azért, mert ez az egyetlen nyelv, amit valahogy ismerek, hogy nem egy másik itt.)

    inc(r0) 

    Az egyes bájtokat megnöveli az r0 kezdeti értékével [ami a simh hibakereső szerint 05162 lehet]. program indítása.

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

    És mint mindig, a végén lévő idegen bájtokat is eltávolíthatjuk csíkokkal.

    Készítettem néhányat megkísérli rövidebbé tenni a forrást, de mindig ge vagy szintaktikai hiba, vagy SIGBUS.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

Deep Theme Powered by WordPress