Schrijft de kortste code die een Segmentatiefout (SIGSEGV) in elke programmeertaal.
Reacties
- Wauw. Misschien wel de kortste geslaagde vraag.
- @MatthewRoh Uit interesse heb ik deze SEDE-zoekopdracht gemaakt. Het lijkt erop dat er een paar zijn met +10 of hoger, maar dit is de eerste boven +40
Antwoord
C, 5 karakters
main;
Het is “een variabele declaratie – int
type is geïmpliceerd (feature gekopieerd van B-taal) en 0
is de standaardwaarde. Wanneer dit wordt uitgevoerd, wordt geprobeerd een getal uit te voeren (getallen zijn “niet uitvoerbaar) en veroorzaakt SIGSEGV
.
Reacties
- @Macmade: eigenlijk is het
0
.static
variabelen beginnen als0
, enmain;
isstatic
, zoals ik het verklaarde buiten de functie. c-faq.com/decl/initval.html - de laatste keer dat ik met dit ding speelde, kwam ik erachter dat er ‘ is een andere reden voor de segfault. Allereerst door main aan te roepen spring je naar de locatie van main, niet de waarde, een ander ding is
main
is een int, het is ‘ s bevinden zich in.bss
, meestal bevinden functies zich in.text
, wanneer de kernel het elf-programma laadt, maakt het een uitvoerbare pagina voor.text
en niet-uitvoerbaar voor.bss
, dus door main aan te roepen, spring je naar een niet-uitvoerbare pagina, en iets uitvoeren op een dergelijke pagina is een beveiligingsfout. - Ja, segfaults in C zijn vrijwel de standaard: P
-
main __attribute__((section(".text#")))=0xc3;
FTFY (het lijkt tenminste terug te keren zonder crasht op mijn x86). - @jozxyqk Of korter,
const main=195;
. Hoe interessant het ook is dat het ‘ werkt, het doel van deze code golfuitdaging was om de code segfault te maken, niet te laten werken :).
Answer
Bash, 11
kill -11 $$
Reacties
- Signaal 11 in 11 karakters. Lijkt legitiem.
- @ nyuszika7h Ik wilde je opmerking up-stemmen, maar je hebt nu 11 upvotes, dus ik ‘ laat het daarbij. : P
- @AlexL. andere mensen lijken dat te hebben bedorven 🙁
- @theonlygusti Ja … dat ‘ is jammer. 🙁 Ach ja, dan kan ik het nu omhoog stemmen .
- Tot 42 upvotes, geen touchee!
Answer
Assembly (Linux , x86-64), 1 byte
RET
Deze code segfaults.
Reacties
- Als een MSDOS .com-bestand wordt het zonder fouten uitgevoerd en beëindigd.
- Mijn punt is: het specificeren van “assembly” is niet ‘ t genoeg om maak het segfault.
- @JB: op MS DOS zal geen programma ooit een segmentatiefout produceren. Dat ‘ s omdat MS DOS in de echte modus draait waar geen geheugenbescherming bestaat.
- @celtschk IIRC NTVDM zal verschijnen op niet-bestaande adressen, en adressen die niet zijn toegewezen aan MS-DOS.
- @celtschk: je kunt het hoe dan ook als volgt segfault: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] – > CPU-verhoging s de onderliggende SEGV (AFAIK daar ‘ s niemand om het af te handelen).
Antwoord
Python 2, 13
exec"()"*7**6
Windows meldt een foutcode van c00000fd (Stack Overflow) waarvan ik aanneem dat het een subtype is van segmentatiefout.
Dankzij Alex A. en Mego is bevestigd dat het ook segmentatiefouten veroorzaakt op Mac- en Linux-systemen. Python is de taal bij uitstek voor het draagbaar crashen van uw programmas.
Opmerkingen
-
Segmentation fault: 11
op Mac -
Segmentation fault (core dumped)
onder Linux - Hangt dit eerst op?
- Het duurt lang voordat @MegaMan Zoals voltooid is ? Nee, 7 ** 6 is slechts ongeveer 100K dus er ‘ s geen waarneembare vertraging.
- @MaxGasner Probeer de programmeertaal opnieuw te lezen 🙂
Answer
pdfTeX ( 51)
\def~#1{\meaning}\write0{\expandafter~\string}\bye
Dit is eigenlijk een bug , maar het is niet aanwezig in de originele TeX, geschreven door Knuth: het compileren van de code met tex filename.tex
in plaats van pdftex filename.tex
levert geen segfault op.
Answer
LOLCODE, 4 bytes
OBTW
Werkt niet online, alleen in de C-interpreter.
Reacties
- LOL FANCY CODE M8 8/8 KTHXBYE
Antwoord
Python, 33 tekens
>>> import ctypes;ctypes.string_at(0) Segmentation fault
Bron: http://bugs.python.org/issue1215#msg143236
Python, 60 tekens
>>> import sys;sys.setrecursionlimit(1<<30);f=lambda f:f(f);f(f) Segmentation fault
Bron: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup
Dit is de Python-versie n Ik ben aan het testen op:
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] on darwin
In het algemeen is de Python-interpreter moeilijk te crashen, maar het bovenstaande is selectief misbruik …
Answer
Forth – 3 karakters
0 @
(@
is een fetch)
Reacties
- De kortste tot dusver die zal werken op moderne systemen.
- Welke Forth? Gforth zegt gewoon ” Ongeldig geheugenadres ”
Antwoord
W32 .com executable – 0 bytes
Dit lijkt raar, maar op 32-bits Windows-systemen kan het maken en uitvoeren van een leeg .com-bestand veroorzaakt een segfault, afhankelijk van … iets. DOS accepteert het gewoon (de 8086 heeft geen geheugenbeheer, er zijn geen betekenisvolle segmenten die fouten kunnen maken), en 64 bit Windows weigert het uit te voeren (x86-64 heeft geen v86-modus om een .com-bestand in uit te voeren).
Antwoord
C, 18
main(){raise(11);}
Reacties
- moet je #include < signal.h > toevoegen aan de codelijst?
- @FlorianCastellane: in C90 en lager, voor elke functieaanroep gedaan zonder een zichtbare declaratie, declareert de compiler het impliciet als
int func()
. d.w.z. een functie dieint
retourneert, met niet-gespecificeerde parameters. In dit geval israise
een functie die int retourneert, met een int-argument, dus dit werkt (zelfs als de compiler klaagt). - @Hasturkun
main(){main();}
Antwoord
Perl (< 5.14), 9 tekens
/(?{??})/
In 5.14 werd de regex-engine opnieuw ingevoerd zodat deze niet op deze manier kon worden gecrasht, maar 5.12 en eerder zal segfault als je dit probeert.
Reacties
- Ik kan dit reproduceren op Perl 5.14 (Debian) en 5.18 (Arch Linux). sprunge.us/RKHT
- Overgenomen met Perl v5.20.2 (windows)
- Hoe zit het met
/(?R)/
op oudere Perl-versies?
Antwoord
hersenkraker (2)
<.
Ja, dit is afhankelijk van de implementatie. SIGSEGV is het waarschijnlijke resultaat van een goede compiler.
Reacties
- Hoe is een compiler die segfaults op die ” goed “? Dat
<
zou óf geen effect moeten hebben óf omsingeld moeten worden. - Het is het beste om onmiddellijk een runtime-fout te produceren bij het overtreden van grenzen, omdat het de programmeur de bug laat vinden en oplossen snel mogelijk. Door het buggy-programma een tijdje te laten draaien en het geheugen lukraak te beschadigen voordat het crasht, wordt het probleem alleen maar moeilijker te diagnosticeren. De crash volledig voorkomen, zoals u suggereert, is het ergst; de programmeur kan het programma ” aan het werk krijgen ” en vervolgens publiekelijk vernederd worden als het crasht op standaard compilers en tolken.
- Omgekeerd is het vangen van grensovertredingen vóór de runtime in het algemeen niet mogelijk, en ook niet bijzonder nuttig in de gevallen waarin het mogelijk is. Het produceren van een meer beschrijvende runtime-fout zou oké zijn, maar het is geweldig om het besturingssysteem deze als een segfault te laten opvangen, omdat het geen ‘ snelheidskosten heeft. (In het geval dat het ‘ niet duidelijk is, doet de compiler zelf geen ‘ t segfault – het produceert uitvoerbare bestanden die segmenteren zodra ze proberen om toegang te krijgen tot geheugen buiten het bereik.)
- Kunt u een implementatie bieden die dit gedrag produceert en werd gemaakt voordat deze uitdaging werd gepost? Als dit niet het geval is, is dit antwoord ongeldig.
- Grenscontroles zijn implementatiespecifiek, dus ik ‘ ben er zeker van dat er een paar fouten zouden maken.Zou een SIGSEGV echter? Ik betwijfel het. Er is echter een groot aantal programmas dat afhankelijk is van de array-wrapping aan de linkerkant. Het kan nogal handig zijn om aan beide kanten opslagruimte te hebben die kan worden gekweekt.
Answer
Haskell, 31
foreign import ccall main::IO()
Dit produceert een segfault wanneer het wordt gecompileerd met GHC en wordt uitgevoerd. Er zijn geen extensievlaggen nodig, aangezien de Foreign Function Interface zich in de Haskell 2010-standaard bevindt.
Opmerkingen
- Awwww. Ik wilde
import Foreign;main=peek nullPtr::IO Int
posten, maar dat ‘ s 40.
Antwoord
Bash, 4 bytes
Golfen
. $0
Neem recursief het script op in zichzelf.
Uitgelegd
Recursieve ” bron ” (.) operatie veroorzaakt uiteindelijk een stack overflow, en aangezien Bash niet integreert met libsigsegv , dit resulteert in een SIGSEGV.
Merk op dat dit geen bug is, maar een verwacht gedrag, zoals hier besproken.
Test
./bang Segmentation fault (core dumped)
Antwoord
Python 33
import os os.kill(os.getpid(),11)
Signaal 11 (SIGSEGV) verzenden in python.
Opmerkingen
- Ook 33 tekens:
from os import*
enkill(getpid(),11)
Antwoord
C – 11 (19) 7 (15) 6 (14) 1 tekens, AT & T x86 assembler – 8 (24) tekens
C-versie is:
*(int*)0=0;
Het hele programma (niet helemaal ISO -conform, laten we aannemen dat s K & RC) 19 tekens lang is:
main(){*(int*)0=0;}
Assembler variant:
orl $0,0
Het hele programma is 24 tekens lang (alleen voor evaluatie, aangezien het niet echt assembler is):
main(){asm("orl $0,0");}
BEWERK :
Een paar C-varianten. De eerste gebruikt nul-initialisatie van de globale pointervariabele:
*p;main(){*p=0;}
De tweede gebruikt oneindige recursie:
main(){main();}
De laatste variant is de kortste – 7 (15) karakters.
EDIT 2 :
Nog een variant uitgevonden die korter is dan een van de bovenstaande – 6 (14) tekens. Het veronderstelt dat letterlijke tekenreeksen in een alleen-lezen segment worden geplaatst.
main(){*""=0;}
EDIT 3 :
En mijn laatste poging – 1 teken lang:
P
Compileer het gewoon zo :
cc -o segv -DP="main(){main();}" segv.c
Reacties
- in C isn ‘ t main; slechts 5 karakters
- : Linker controleert niet ‘ of main een functie is of niet. Het geeft het gewoon door aan de loader en retourneer sigsegv
- @FUZxxl In dit geval is
main
een nul-geïnitialiseerde globale int variabele, dus wat we krijgen is een resultaat van het proberen uit te voeren van enkele nul bytes. In x86 is het ‘ zoiets alsadd %al,(%rax)
wat een volkomen geldige instructie is die probeert het geheugen te bereiken op het adres dat is opgeslagen in%rax
. De kans om daar een goed adres te hebben is minimaal. - Natuurlijk kan de laatste invoer voor alles worden gebruikt, je hoeft alleen de juiste compilerargumenten op te geven. Dat zou het de automatische winnaar moeten maken van elke codegolfwedstrijd. 🙂
- Gewoonlijk worden compilervlaggen anders dan degene die de taalversie kiezen die moet worden gebruikt, meegeteld voor het totaal.
Antwoord
Perl, 10/12 tekens
Een enigszins bedrieglijke oplossing is om één teken eraf te scheren Joey Adams “bash-truc :
kill 11,$$
Om echter een echte segfault in Perl te krijgen, is unpack p
de voor de hand liggende oplossing :
unpack p,1x8
Technisch gezien is dit niet gegarandeerd voor segfault, aangezien het adres 0x31313131 (of 0x3131313131313131 op 64-bits systemen) wijst misschien toevallig naar een geldige adresruimte. Maar de kansen zijn ertegen. Als perl ooit wordt geport naar platforms waar pointers langer zijn dan 64 bits, moet de x8
worden verhoogd.
Reacties
- Wat is dit
1x8
ding? - @HannesKarppila Het ‘ is een korte manier om te schrijven
"11111111".
Answer
dc – 7 chars
[dx0]dx
veroorzaakt een stack-overflow
Reacties
- Is het werkt, maar kun je dat toelichten? Waarom gedraagt het zich zo?
-
[dx0]
slaatdx0
op de stapel op en vervolgensd
dupliceert het bovenste stapelelement,x
laat het bovenste stapelelement verschijnen (dx0
) en voert het uit. Dat dupliceert het bovenste stapelelement en begint het uit te voeren … de0
moet aanwezig zijn om te voorkomen dat dit een staartaanroep is, dus ze bouwen zich allemaal op.
Antwoord
PicoLisp – 4 karakters
$ pil : ("0) Segmentation fault
Dit is bedoeld gedrag. Zoals beschreven op hun website:
Als sommige programmeertalen beweren het “Swiss Army Knife of Programming” te zijn, dan kan PicoLisp heel goed de “Scalpel” worden genoemd of Programming “: Scherp, nauwkeurig, klein en lichtgewicht, maar ook gevaarlijk in de hand van onervaren.
Antwoord
F90 – 39 bytes
real,pointer::p(:)=>null() p(1)=0. end
Compilatie:
gfortran segv.f90 -o segv
Uitvoering:
./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)
Materialen:
gfortran --version GNU Fortran (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
Reacties
- Leuke eerste post.
Antwoord
Eigenlijk , 17 16 11 10 9 bytes
⌠[]+⌡9!*.
Als het bovenstaande niet crasht, probeer dan het aantal te verhogen (meercijferige getallen worden in Actually gespecificeerd met een voorloopkomma )
Crasht de interprete r door gebruik te maken van een bug in python met diep geneste itertools.chain
objecten, die feitelijk worden gebruikt om de +
operator.
Antwoord
OCaml, 13 bytes
Obj.magic 0 0
Dit gebruikt de functie Obj.magic
, die op onveilige wijze twee typen dwingt. In dit geval dwingt het 0 (opgeslagen als de onmiddellijke waarde 1, vanwege de tagbit die door de GC wordt gebruikt) naar een functietype (opgeslagen als een pointer). Het probeert dus de verwijzing naar het adres 1 te herleiden, en dat zal natuurlijk segfault zijn.
Opmerkingen
-
it coerces 0 (stored as the immediate value 1)
– waarom wordt 0 opgeslagen als 1? - @Skyler zie bewerken
-
Obj.magic()0
is één teken korter 🙂
Antwoord
Pyth, 3 karakters
j1Z
Dit zou het deel zijn waarin ik uitleg hoe ik tot dit antwoord kwam, behalve dat ik terecht geen idee heb. Als iemand me dit zou kunnen uitleggen, zou ik “dankbaar zijn.
Hier staat het in een online tolk.
Uitleg
j
vierkant de basis en roept zichzelf recursief totdat de basis minstens zo groot is als het nummer. Aangezien de basis 0 is, gebeurt nooit. Met een voldoende hoge recursielimiet, krijg je een segfault.
Reacties
- Iets bedacht! Door Pyth ‘ s bron te bladeren, ontdekte ik dat deze code
j
op1
en0
, die probeert om1
te converteren naar0
. Waarom dat segfaults, ik heb nee idee … - Zie hier .
j
vierkant het basisstation en roept zichzelf recursief op totdat het basisstation minstens zo groot is als het nummer. Aangezien de basis 0 is, gebeurt dat nooit. Met een voldoende hoge recursielimiet krijg je een segfault. - @Dennis IDEone
- @SeeRhino De Pyth-interpreter stelt de recursielimiet in op 100.000. Tenminste op TIO, dat ‘ is voldoende voor een segfault.
Antwoord
C # – 62
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
C # / onveilig, 23 bytes
unsafe{int i=*(int*)0;}
Om de een of andere reden begrijp ik het niet, *(int*)0=0
gooit gewoon een NullReferenceException, terwijl deze versie de juiste toegangsschending geeft.
Opmerkingen
- De
int i=*(int*)0;
retourneert een NullReferenceException voor mij. - U kunt proberen toegang te krijgen tot een negatieve locatie, zoals
*(int*)-1=0
en een toegangsschending te krijgen. - De specifieke uitzondering is precies wat de clr wikkelt het in, en is onbeduidend. Het besturingssysteem zelf geeft in al deze gevallen de seg-fout.
- De reden waarom
*(int*)0=0
een uitzondering genereert, is waarschijnlijk te wijten aan optimalisatie. Om de kosten van het controleren opnull
te vermijden, kan de optimizer met name null-controles verwijderen, maar wanneer er een segfault optreedt, kan het deze opnieuw als een juisteNullReferenceException
.
Answer
19 tekens in C
main(a){*(&a-1)=1;}
Het corrumpeert de retouradreswaarde van de hoofdfunctie, dus het krijgt een SIGSEGV bij teruggave van main
.
Opmerkingen
- Het hangt af van de stack-frame-indeling, dus in sommige architectuur kan het mogelijk niet mislukken.
- Waarom niet gewoon
main;
, ofmain(){*""=0;}
? - @Sapphire_Brick
main;
staat al in een ander antwoord. - @saeedn Waarom zou je het dan überhaupt posten? Deze is niet ‘ zelfs de tweede tot de kortste!
- @Sapphire_Brick Op het moment dat ik de mijne postte,
main;
wasn ‘ niet gepost en ik wist niet ‘ niet dat het werkt. Ik wees er alleen maar op dat het al gegeven is en het heeft geen zin mijn antwoord te veranderen. Bovendien, mensen hier niet ‘ posten alleen voor de kortste, soms is een andere manier om het probleem op te lossen ook interessant.
Answer
Cython, 14
Dit is vaak handig voor foutopsporing.
a=(<int*>0)[0]
Antwoord
J (6)
memf 1
memf
betekent vrij geheugen, 1
wordt geïnterpreteerd als een pointer.
Opmerkingen
- Waarom
1
in plaats van0
? Is het legaal om een null-pointer vrij te maken in J?
Answer
Matlab – Ja, het is mogelijk!
In een antwoord op een vraag van mij, bedacht Amro deze eigenaardigheid:
S = struct(); S = setfield(S, {}, "g", {}, 0)
Reacties
- Geef Matlab versie – R2015B (en 2016B ook) gooit gewoon een foutmelding: Fout bij gebruik van setfield (regel 56) Ten minste één index is vereist.
- @FlorianCastellane Ik kan nu niet alle versies proberen, maar er is bevestigd dat het in een groot aantal versies een segfault geeft, de laatste is 2014b en de vroegste 2012a.
Antwoord
C – 14 tekens
Zorg ervoor dat je een leeg bestand compileert met cc -nostartfiles c.c
Uitleg:
Wat er mis ging, is dat we _start behandelden alsof het een C-functie was, en probeerde ervan terug te keren. In werkelijkheid is het helemaal geen functie. Het is gewoon een symbool in het objectbestand dat de linker gebruikt om het startpunt van het programma te lokaliseren. Wanneer ons programma wordt aangeroepen, wordt het direct aangeroepen. Als we zouden kijken, zouden we zien dat de waarde bovenaan de stapel het nummer 1 was, wat zeker erg niet-adresachtig is. In feite is wat er op de stapel staat de argc-waarde van ons programma. Hierna komen de elementen van de array argv, inclusief het afsluitende NULL-element, gevolgd door de elementen van envp. En dat is alles. Er staat geen retouradres op de stapel.
Reacties
- I ‘ Ik ben er vrij zeker van dat je moet scoren met de extra argumenten
- Je moet 14 bytes toevoegen voor de speciale vlag.
- @ErikGolfer エ リ ー ク ゴ ル フ ァ ー -nostartfiles is eigenlijk 13 bytes lang 🙂
- @CharlesPaulet Ik denk dat je de spatie ook moet tellen.
Antwoord
Unix PDP-11 assembly, 18 bytes binair, 7 bytes source
(dit wordt een thema bij mij, misschien omdat het de enige taal is die ik een beetje ken dat nee- iemand anders hier doet.)
inc(r0)
Verhoogt de enkele byte geadresseerd met de initiële waarde van r0 [wat toevallig 05162 is volgens de simh debugger] vanaf programma start.
0000000 000407 000002 000000 000000 000000 000000 000000 000000 0000020 005210 000000
En, zoals altijd, kunnen de overbodige bytes aan het einde worden verwijderd met strip.
Ik heb er een paar gemaakt probeert de bron korter te krijgen, maar is altijd ge tting ofwel een syntaxisfout of SIGBUS.