Cel mai scurt cod care generează un SIGSEGV

Scrieți cel mai scurt cod care generează o Segmentation Fault (SIGSEGV) în orice limbaj de programare.

Comentarii

  • Uau. Probabil cea mai scurtă întrebare de succes.
  • @MatthewRoh Din interes, am făcut această interogare SEDE. Se pare că sunt câteva cu +10 sau mai mare, dar acesta este primul de mai sus +40

Răspuns

C, 5 caractere

main; 

Este „o declarație variabilă – tipul int este implicit (caracteristică copiată din Limbajul B) și 0 este valoarea implicită. Când este executat, acesta încearcă să execute un număr (numerele nu sunt executabile) și provoacă SIGSEGV .

Încercați online!

Comentarii

  • @Macmade: De fapt, este 0. static variabilele încep ca 0 și main; este static, așa cum l-am declarat în afara funcției. c-faq.com/decl/initval.html
  • ultima dată când am jucat cu acest lucru, mi-am dat seama că există ‘ este un motiv diferit pentru segfault. Mai întâi de toate, apelând main, treceți la locația main, nu la valoare, un alt lucru este main este un int, it ‘ s se află în .bss, de obicei funcțiile sunt localizate în .text, atunci când nucleul încarcă programul elf creează o pagină executabilă pentru .text și neexecutabil pentru .bss, așadar, apelând main, treceți la o pagină neexecutabilă și executați ceva pe o astfel de pagină este un eroare de protecție.
  • Da, defectele din C sunt aproape implicite: P
  • main __attribute__((section(".text#")))=0xc3; FTFY (cel puțin se pare că revine fără se blochează pe x86).
  • @jozxyqk Sau mai scurt, const main=195;. La fel de interesant este faptul că ‘ funcționează, obiectivul acestei provocări de golf a fost de a face codul să nu fie funcțional :).

Răspuns

Bash, 11            

kill -11 $$ 

Comentarii

  • Semnal 11 în 11 caractere. Pare legitim.
  • @ nyuszika7h Aveam de gând să susțin comentariul dvs., dar aveți 11 voturi pozitive chiar acum, așa că ‘ voi lăsa asta. : P
  • @AlexL. alți oameni par să fi stricat asta 🙁
  • @theonlygusti Da … Asta e ‘ păcat. 🙁 Ei bine, atunci pot să votez acum .
  • Până la 42 de voturi, fără atingere!

Răspuns

Asamblare (Linux , x86-64), 1 octeți

RET 

Acest cod este implicit.

Comentarii

  • Fiind un fișier .com MSDOS, acesta rulează și se termină fără erori.
  • Punctul meu este: specificarea „asamblării” nu este suficientă pentru a faceți-l separat.
  • @JB: Pe MS DOS, programul nu va produce vreodată o eroare de segmentare.

deoarece MS DOS rulează în modul real, unde protecția memoriei este inexistentă.

  • @celtschk IIRC NTVDM va apărea pe adrese inexistente și pe cele care nu sunt alocate MS-DOS.
  • @celtschk: Puteți să-l separați oricum astfel: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] – > CPU raise s SEGV-ul subiacent (AFAIK nu există ‘ nimeni care să o gestioneze).
  • Răspuns

    Python 2, 13

    exec"()"*7**6 

    Windows raportează un cod de eroare de c00000fd (Stack Overflow) pe care l-aș presupune că este un subtip de eroare de segmentare.

    Datorită lui Alex A. și Mego, se confirmă că provoacă erori de segmentare și pe sistemele Mac și Linux. Python este limba preferată pentru blocarea portabilă a programelor dvs.

    Comentarii

    • Segmentation fault: 11 pe Mac
    • Segmentation fault (core dumped) pe Linux
    • Închide acest lucru mai întâi?
    • @MegaMan Ca și în ultimul timp, trebuie să terminați ? Nu, 7 ** 6 este de aproximativ 100K, deci nu există ‘ nici o întârziere perceptibilă.
    • @MaxGasner Încercați să citiți din nou limbajul de programare 🙂

    Răspuns

    pdfTeX ( 51)

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

    Acesta este de fapt probabil un bug , dar nu este prezent în TeX-ul original, scris de Knuth: compilarea codului cu tex filename.tex în loc de pdftex filename.tex nu produce un segfault.

    Răspuns

    LOLCODE, 4 octeți

    OBTW 

    Nu funcționează doar online în interpretul C.

    Comentarii

    • COD LOL FANCY M8 8/8 KTHXBYE

    Răspuns

    Python, 33 caractere

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

    Sursă: http://bugs.python.org/issue1215#msg143236

    Python, 60 de caractere

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

    Sursă: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup

    Aceasta este versiunea Python n „Testez pe:

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

    În general, interpretul Python este greu de blocat, dar cele de mai sus sunt abuzive selective …

    Răspuns

    Mai departe – 3 caractere

    0 @ 

    (@ este o preluare)

    Comentarii

    • Cel mai scurt până acum care va funcționa pe sistemele moderne.
    • Care Forth? Gforth spune doar ” Adresă de memorie nevalidă ”

    Răspuns

    W32 .com executabil – 0 octeți

    Acest lucru va părea ciudat, dar pe sistemele Windows pe 32 de biți, crearea și executarea unui fișier .com gol poate provoacă o segfault, în funcție de … ceva. DOS doar îl acceptă (8086 nu are gestionare a memoriei, nu există segmente semnificative de defect) și Windows pe 64 de biți refuză să-l ruleze (x86-64 neavând mod v86 pentru a rula un fișier .com).

    Răspuns

    C, 18

    main(){raise(11);} 

    Comentarii

    • trebuie să adăugați #include < signal.h > în lista de coduri?
    • @FlorianCastellane: în C90 și versiunile inferioare, pentru orice apel de funcție efectuat fără o declarație vizibilă, compilatorul îl declară implicit ca int func(). adică o funcție care returnează int, luând parametri nespecificați. În acest caz, raise este o funcție care returnează int, luând un argument int, deci funcționează (chiar dacă compilatorul se plânge).
    • @Hasturkun main(){main();}

    Răspuns

    Perl (< 5.14), 9 caractere

    /(?{??})/ 

    În 5.14 motorul regex a devenit reentrant, astfel încât să nu poată fi blocat în acest mod, ci 5.12 și mai devreme va segfault dacă încercați acest lucru.

    Comentarii

    • Pot reproduce acest lucru pe Perl 5.14 (Debian) și 5.18 (Arch Linux). sprunge.us/RKHT
    • Reprodus cu Perl v5.20.2 (windows)
    • Dar /(?R)/ pentru versiunile mai vechi de Perl?

    Răspuns

    brainfuck (2)

    <. 

    Da, aceasta este dependentă de implementare. SIGSEGV este rezultatul probabil de la un compilator bun.

    Comentarii

    • Cum este un compilator care să difuzeze pe acel ” bun „? Acel < nu ar trebui să aibă niciun efect sau să se încheie.
    • Imediat producerea unei erori de runtime la încălcarea limitelor este cea mai bună, deoarece permite programatorului să găsească și să remedieze eroarea ca cât mai repede posibil. Lăsați programul buggy să ruleze pentru o vreme și să corupă memoria la întâmplare înainte de blocare, îngreunează diagnosticul. Prevenirea completă a accidentului, așa cum sugerați, este cea mai rea; programatorul poate face ca programul ” să funcționeze ” și apoi să fie umilit public atunci când se blochează pe compilatoarele și interpreții standard.
    • În schimb, prinderea încălcărilor limitelor înainte de runtime nu este posibilă în general și nici deosebit de utilă în cazurile în care este posibilă. Producerea unei erori de descărcare mai durabile ar fi în regulă, dar dacă sistemul de operare o prinde ca un segfault este excelent, deoarece nu are ‘ niciun cost de viteză. (În cazul în care ‘ nu este clar, compilatorul în sine nu ‘ t segfault – produce executabile care segfault imediat ce încearcă pentru a accesa memoria în afara limitelor.)
    • Puteți furniza o implementare care produce acest comportament și care a fost creată înainte ca această provocare să fie postată? În caz contrar, acest răspuns este nevalid.
    • Verificările limită sunt specifice implementării, așa că sunt ‘ sigur că sunt unele care ar erora.Ar fi vreun SIGSEGV? Mă îndoiesc de asta. Există însă un număr mare de programe care depind de învelirea matricei din stânga. Poate fi destul de convenabil să aveți spațiu de stocare cultivabil pe ambele părți.

    Răspuns

    Haskell, 31

    foreign import ccall main::IO() 

    Aceasta produce un segfault atunci când este compilat cu GHC și rulat. Nu sunt necesare semnalizatoare de extensie, deoarece Interfața funcției străine este în standardul Haskell 2010.

    Comentarii

    • Awwww. Aveam să postez import Foreign;main=peek nullPtr::IO Int, dar ‘ s 40.

    Răspuns

    Bash, 4 octeți

    Golfed

     . $0  

    Includeți recursiv scriptul în sine.

    Explicat

    Recursiv ” sursă ” (.) Operațiunea provoacă în cele din urmă o revărsare a stivei și, deoarece Bash nu se integrează cu libsigsegv , rezultă un SIGSEGV.

    Rețineți că acesta nu este un bug, ci un comportament așteptat, așa cum s-a discutat aici .

    Test

     ./bang Segmentation fault (core dumped)  

    Încercați online!

    Răspundeți

    Python 33

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

    Trimiterea semnalului 11 (SIGSEGV) în python.

    Comentarii

    • De asemenea, 33 de caractere: from os import* și kill(getpid(),11)

    Răspuns

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

    Versiunea C este:

    *(int*)0=0; 

    Întregul program (nu chiar ISO -conform, să presupunem că s

    RC) are 19 caractere lungime:

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

    Asamblator variantă:

    orl $0,0 

    Întregul program are o lungime de 24 de caractere (doar pentru evaluare, deoarece nu este de fapt asamblator):

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

    EDITĂ :

    Câteva variante C. Primul folosește inițializarea zero a variabilei pointer global:

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

    Al doilea folosește recursivitate infinită:

    main(){main();} 

    Ultima variantă este cea mai scurtă – 7 (15) caractere.

    EDIT 2 div id = „3f4ec23401”> :

    A inventat încă o variantă care este mai scurtă decât oricare dintre cele de mai sus – 6 (14) caractere. Se presupune că șirurile literale sunt plasate într-un segment de numai citire.

    main(){*""=0;} 

    EDITARE 3 :

    Și ultima mea încercare – 1 caracter lung:

    P 

    Compilați-l așa :

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

    Comentarii

    • în C isn ‘ t principal; doar 5 caractere
    • : Linker nu ‘ nu verifică dacă funcția principală este sau nu funcțională. încărcătorul și returnarea sigsegv
    • @FUZxxl În acest caz main este o variabilă int globală inițializată zero, deci ceea ce obținem este un rezultat al încercării de a executa niște octeți zero. În x86, ‘ ar fi ceva de genul add %al,(%rax) care este o instrucțiune perfect validă care încearcă să ajungă la memorie la adresa stocată în %rax. Șansele de a avea o adresă bună acolo sunt minime.
    • Desigur, ultima intrare poate fi utilizată pentru orice, trebuie doar să furnizați argumentele potrivite ale compilatorului. Ceea ce ar trebui să îl facă câștigătorul automat al oricărui concurs de golf de cod. 🙂
    • De obicei, semnalizatoarele de compilare, altele decât cele care aleg versiunea de limbă de utilizat, sunt luate în calcul la total.

    Răspuns

    Perl, 10/12 caractere

    O soluție ușor ieftină este de a rade un caracter truc bash Joey Adams :

    kill 11,$$ 

    Cu toate acestea, pentru a obține un segfault real în Perl, unpack p este soluția evidentă :

    unpack p,1x8 

    Din punct de vedere tehnic, acest lucru nu este „t garantat să fie separat, deoarece adresa 0x31313131 (sau 0x313131313131313131 pe sistemele pe 64 de biți) s-ar putea să indice întâmplător spațiul de adrese valabil. Dar șansele sunt împotriva ei. De asemenea, dacă perlul este portat vreodată pe platforme unde indicatoarele depășesc 64 de biți, x8 va trebui mărit.

    Comentarii

    • Ce este acest lucru 1x8?
    • @HannesKarppila Este ‘ o modalitate scurtă de a scrie "11111111".

    Răspuns

    dc – 7 caractere

    [dx0]dx 

    cauzează o revărsare a stivei

    Comentarii

    • Funcționează, dar puteți detalia? De ce se comportă așa?
    • [dx0] stochează dx0 pe stivă, apoi d duplică elementul stivei de sus, apoi x apare elementul stivei de sus (dx0) și îl execută. Care duplică elementul stivei de sus și începe să-l execute … 0 trebuie să fie acolo pentru a împiedica acest apel, așa că toate se acumulează.

    Răspuns

    PicoLisp – 4 caractere

    $ pil : ("0) Segmentation fault 

    Aceasta este un comportament intenționat. Așa cum este descris pe site-ul lor web:

    Dacă unele limbaje de programare pretind că sunt „cuțitul elvețian de programare”, atunci PicoLisp poate fi numit „Scalpel” de programare „: Ascuțit, precis, mic și ușor, dar, de asemenea, periculos în mâna celor neexperimentați.

    Răspuns

    F90 – 39 octeți

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

    Compilație:

    gfortran segv.f90 -o segv 

    Execuție:

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

    Materiale:

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

    Comentarii

    • Frumos prim mesaj.

    Răspuns

    De fapt , 17 16 11 10 9 octeți

    ⌠[]+⌡9!*. 

    Încercați-l online!

    Dacă cele de mai sus nu se blochează, încercați să măriți numărul (numerele cu mai multe cifre sunt specificate în De fapt, cu un punct principal )

    Blochează interpretarea r exploatând o eroare în python care implică obiecte itertools.chain cuibărite profund, care de fapt se folosește pentru a implementa + operator.

    Răspuns

    OCaml, 13 octeți

    Obj.magic 0 0 

    Aceasta folosește funcția Obj.magic, care constrânge în mod sigur orice două tipuri. În acest caz, constrânge 0 (stocat ca valoarea imediată 1, datorită bitului de etichetă utilizat de GC) la un tip de funcție (stocat ca un pointer). Astfel, încearcă să renunțe la adresa 1, iar aceasta va fi, desigur, segfault.

    Comentarii

    • it coerces 0 (stored as the immediate value 1) – de ce este 0 stocat ca 1?
    • @Skyler vezi editarea
    • Obj.magic()0 este cu un caracter mai scurt 🙂

    Răspuns

    Pyth, 3 caractere

    j1Z 

    Aceasta ar fi partea în care explic cum am venit cu acest răspuns, cu excepția faptului că nu am în mod legitim niciun indiciu . Dacă cineva ar putea explica acest lucru pentru mine, aș fi recunoscător.

    Iată-l într-un interpret online.

    Explicație

    j pătrează baza și se numește recursiv până când baza este cel puțin la fel de mare ca numărul. Deoarece baza este 0 , nu se întâmplă niciodată. Cu o limită de recursivitate suficient de mare, veți obține un segfault.

    div id = „3f4ec23401”>

    Comentarii

    • Am găsit ceva! Din căutarea sursei Pyth ‘, am constatat că acest cod face j pe 1 și 0, care încearcă să convertească 1 în bază 0. De ce acele segfaults, nu am idee …
    • Consultați aici . j pătrează baza și se numește recursiv până când baza este cel puțin la fel de mare ca numărul. Deoarece baza este 0 , asta nu se întâmplă niciodată. Cu o limită de recursivitate suficient de mare, veți obține un segfault.
    • @Dennis IDEone
    • @SeeRhino Interpretul Pyth setează limita de recursivitate la 100.000. Cel puțin pe TIO, ‘ este suficient pentru un segfault.

    Răspuns

    C # – 62

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

    C # / nesigur, 23 octeți

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

    Din anumite motive, nu înțeleg, *(int*)0=0 aruncă doar o NullReferenceException, în timp ce această versiune oferă încălcarea corectă a accesului.

    Comentarii

    • int i=*(int*)0; returnează o NullReferenceException pentru mine.
    • Puteți încerca să accesați o locație negativă, cum ar fi *(int*)-1=0 și să obțineți o încălcare a accesului.
    • Excepția specială este exact ceea ce clr îl înfășoară și este nesemnificativ. Sistemul de operare în sine dă defecțiunea seg în toate aceste cazuri.
    • Motivul pentru care *(int*)0=0 aruncă o excepție se datorează probabil optimizării. În mod specific, pentru a evita costul verificării null, optimizatorul poate elimina verificările nule, dar atunci când apare un segfault, îl poate retrage ca NullReferenceException.

    Răspuns

    19 caractere în C

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

    Corupă valoarea adresei de returnare a funcției principale, deci primește un SIGSEGV la returnarea main.

    Comentarii

    • Depinde de aspectul cadrului stivei, deci în unele arhitecturi nu poate eșua.
    • De ce nu pur și simplu main;, sau main(){*""=0;}?
    • @Sapphire_Brick main; este deja dat într-un alt răspuns.
    • @saeedn Atunci de ce să-l postezi deloc? Acesta nu este ‘ nici măcar al doilea până la cel mai scurt!
    • @Sapphire_Brick În momentul în care îl postam pe al meu, main; nu a fost postat ‘ și nu ‘ nu știam că funcționează. Am subliniat doar că este deja dat și că nu are rost să-mi schimb răspunsul. Mai mult, oamenii de aici nu ‘ postează doar pentru cel mai scurt, uneori este interesant și un mod diferit de a rezolva problema.

    Răspuns

    Cython, 14

    Acest lucru este de multe ori util pentru scopuri de depanare.

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

    Răspuns

    J (6)

    memf 1 

    memf înseamnă memorie liberă, 1 este interpretat ca un pointer.

    Comentarii

    • De ce 1 mai degrabă decât 0? Este legal să eliberați un indicator nul în J?

    Răspuns

    Matlab – Da, este posibil!

    Într-un răspuns la o întrebare a mea, Amro a venit cu acest quirk:

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

    Comentarii

    • Vă rugăm să dați versiunea Matlab – R2015B (și 2016B, de asemenea) aruncă o eroare: Eroare la utilizarea setfield (linia 56) Cel puțin una indexul este obligatoriu.
    • @FlorianCastellane Nu pot încerca toate versiunile acum, dar s-a confirmat că oferă un segfault în destul de multe versiuni, ultima fiind 2014b și cea mai timpurie 2012a.

    Răspuns

    C – 14 caractere

    Asigurați-vă că compilați un fișier gol cu cc -nostartfiles c.c

    Explicație:

    Ceea ce nu a funcționat este că am tratat _start ca și cum ar fi o funcție C, și a încercat să se întoarcă din ea. În realitate, nu este deloc o funcție. Este doar un simbol din fișierul obiect pe care linker-ul îl folosește pentru a localiza punctul de intrare al programului. Când programul nostru este invocat, acesta este invocat direct. Dacă ar fi să ne uităm, am vedea că valoarea din partea de sus a stivei a fost numărul 1, care este cu siguranță foarte neadresabil. De fapt, ceea ce este în stivă este valoarea argc a programului nostru. După aceasta vin elementele matricei argv, inclusiv elementul NULL care se termină, urmat de elementele envp. Și asta este tot. Nu există nicio adresă de returnare în stivă.

    Comentarii

    • I ‘ Sunt destul de sigur că trebuie să înscrieți cu argumentele suplimentare
    • Trebuie să adăugați 14 octeți pentru semnalizatorul special.
    • @ErikGolfer エ リ ッ ク ゴ ル フ ァ ー -nostartfiles este de fapt lungime de 13 octeți 🙂
    • @CharlesPaulet Cred că trebuie să numeri și spațiul.

    Răspunde

    Asamblare PDP-11 Unix, binar de 18 octeți, sursă de 7 octeți

    (aceasta devine o temă cu mine, poate pentru că este singura limbă pe care o știu că nu încă o face aici.)

    inc(r0) 

    Mărește octetul unic adresat de valoarea inițială a r0 [care se întâmplă să fie 05162 conform simh debugger] începând cu programul începe.

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

    Și, ca întotdeauna, octeții străini de la sfârșit pot fi eliminați cu bandă.

    Am făcut câteva încearcă să reducă sursa, dar întotdeauna a ajuns ge selectând fie o eroare de sintaxă, fie SIGBUS.

    Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *