Í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
.
Megjegyzések
- @Macmade: Valójában ez
0
. Astatic
változók0
néven kezdődnek, amain;
pedigstatic
, 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 atex 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ó, amelyint
-vel tér vissza, meghatározatlan paramétereket vesz fel. Ebben az esetben araise
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)
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*
éskill(getpid(),11)
Válasz
C –
11 (19)7 (15)6 (14)1 karakter, AT & T x86 assembler – 8 (24) karakterA 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, mintadd %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, majdd
lemásolja a legfelső verem elemet, majd ax
feldobja a felső verem elemet (dx0
) és végrehajtja. Ami lemásolja a legfelső verem elemet, és elkezdi végrehajtani … A0
-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 109 bájt⌠[]+⌡9!*.
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.Megjegyzések
- Kitaláltam valamit! A Pyth ' s forrás böngészéséből kiderült, hogy ez a kód
j
a1
és0
, amely megpróbálja átalakítani a1
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, anull
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;
, vagymain(){*""=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, a1
mutatóként értelmezhető.Megjegyzések
- Miért
1
, nem pedig0
? 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.