Kode terpendek yang memunculkan SIGSEGV


Jawaban:


113

C, 5 karakter

main;

Ini adalah deklarasi variabel - intjenis tersirat (fitur disalin dari bahasa B) dan 0merupakan nilai default. Ketika dieksekusi ini mencoba untuk mengeksekusi angka (angka tidak dapat dieksekusi), dan menyebabkan SIGSEGV.

Cobalah online!


5
@Macmade: Sebenarnya, benar 0. staticvariabel mulai sebagai 0, dan main;adalah static, seperti yang saya menyatakan fungsi luar. c-faq.com/decl/initval.html
Konrad Borowski

16
Terakhir kali saya bermain dengan hal ini, saya menemukan bahwa ada alasan berbeda untuk segfault. Pertama-tama dengan memanggil main Anda melompat ke lokasi main, bukan nilainya, hal lain adalah mainint, itu terletak di .bss, biasanya fungsi terletak di .text, ketika kernel memuat program elf itu membuat halaman yang dapat dieksekusi untuk .textdan non -dieksekusi untuk .bss, jadi dengan memanggil utama, Anda melompat ke halaman yang tidak dapat dieksekusi, dan mengeksekusi sesuatu pada halaman tersebut adalah kesalahan perlindungan.
mniip

23
Yap, segfault dalam C adalah default: P
Paul Draper

1
main __attribute__((section(".text#")))=0xc3;FTFY (setidaknya tampaknya kembali tanpa menabrak x86 saya).
jozxyqk

2
@ jozxyqk Atau lebih pendek const main=195;,. Yang menarik adalah bahwa itu berfungsi, tujuan dari tantangan golf kode ini adalah untuk membuat kode segfault, bukan bekerja :).
Konrad Borowski

74

Bash, 11      

kill -11 $$

44
Sinyal 11 dalam 11 karakter. Kelihatannya mantap.
nyuszika7h

12
@ nyuszika7h Saya akan mengubah komentar Anda, tetapi Anda memiliki 11 suara positif sekarang, jadi saya akan berhenti di situ saja. : P
HyperNeutrino

3
@AlexL. orang lain tampaknya telah merusak itu :(
theonlygusti

2
@ theonlygusti Ya ... Itu terlalu buruk. :( Oh well, kalau begitu aku bisa mengambilnya sekarang.
HyperNeutrino

2
Hingga 42 suara positif, tidak ada sentuhan!
seadoggie01

39

Majelis (Linux, x86-64), 1 byte

RET

Kode ini segfault.


7
Sebagai file MSDOS .com, ini berjalan dan berakhir tanpa kesalahan.
JB

10
Maksud saya adalah: hanya menentukan "perakitan" tidak cukup untuk membuatnya segfault.
JB

52
@JB: Pada MS DOS, tidak ada program yang akan pernah menghasilkan kesalahan segmentasi. Itu karena MS DOS berjalan dalam mode nyata di mana perlindungan memori tidak ada.
celtschk

1
@celtschk IIRC NTVDM akan menambah alamat yang tidak ada, dan yang tidak dialokasikan untuk MS-DOS.
ζ--

2
@celtschk: Anda tetap bisa melakukan segmentasi seperti: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] -> CPU menaikkan SEGV yang mendasarinya (AFAIK tidak ada yang mengatasinya).
Yosua

26

Python 2, 13

exec'()'*7**6

Windows melaporkan kode kesalahan c00000fd (Stack Overflow) yang saya anggap sebagai subtipe dari kesalahan segmentasi.

Berkat Alex A. dan Mego, dipastikan menyebabkan kesalahan segmentasi pada sistem Mac dan Linux. Python adalah bahasa pilihan untuk crash program Anda.


7
Segmentation fault: 11di Mac
Alex A.

7
Segmentation fault (core dumped)di Linux
Mego

Apakah ini ditutup dulu?
Mega Man

1
@MegaMan As butuh waktu lama untuk selesai? Tidak, 7 ** 6 hanya sekitar 100 ribu sehingga tidak ada penundaan yang terlihat.
feersum

Mengapa ini bekerja? Tampaknya tidak pada Python 3.6.8 di Mac OS.
Max Gasner

22

pdfTeX (51)

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

Ini sebenarnya mungkin bug , tetapi tidak ada dalam TeX asli, yang ditulis oleh Knuth: kompilasi kode dengan tex filename.texbukannya pdftex filename.textidak menghasilkan segfault.



17

Python, 33 karakter

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

Sumber: http://bugs.python.org/issue1215#msg143236

Python, 60 karakter

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

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

Ini adalah versi Python yang saya uji pada:

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

Secara umum interpreter Python sulit untuk crash, tetapi di atas adalah kekerasan selektif ...


16

Keempat - 3 karakter

0 @

( @mengambil)


1
Sejauh ini yang terpendek yang akan bekerja pada sistem modern.
Demi

2
Yang Keempat? Gforth hanya mengatakan "Alamat memori tidak valid"
cat

15

C, 18

main(){raise(11);}

apakah Anda perlu menambahkan #include <signal.h> dalam daftar kode?
Florian Castellane

5
@FlorianCastellane: di C90 dan lebih rendah, untuk panggilan fungsi yang dilakukan tanpa deklarasi yang terlihat, kompiler secara implisit menyatakannya sebagai int func(). yaitu fungsi yang mengembalikan int, mengambil parameter yang tidak ditentukan. Dalam hal ini raiseadalah fungsi mengembalikan int, mengambil argumen int, jadi ini berhasil (bahkan jika kompiler mengeluh).
Hasturkun

14

Perl (<5,14), 9 karakter

/(?{??})/

Di 5.14, mesin regex dibuat reentrant sehingga tidak bisa crash dengan cara ini, tetapi 5.12 dan sebelumnya akan segfault jika Anda mencoba ini.


Saya dapat mereproduksi ini di Perl 5.14 (Debian) dan 5.18 (Arch Linux). sprunge.us/RKHT
nyuszika7h

Diproduksi ulang dengan Perl v5.20.2 (windows)
mehi

14

Eksekusi W32 .com - 0 byte

Ini akan terasa aneh, tetapi pada sistem Windows 32 bit, membuat dan mengeksekusi file .com kosong dapat menyebabkan segfault, tergantung pada ... sesuatu. DOS hanya menerimanya (8086 tidak memiliki manajemen memori, tidak ada segmen yang berarti untuk kesalahan), dan Windows 64 bit menolak untuk menjalankannya (x86-64 tidak memiliki mode v86 untuk menjalankan file .com).


13

brainfuck (2)

<.

Ya, ini tergantung pada implementasi. SIGSEGV kemungkinan merupakan hasil dari kompiler yang baik.


4
Bagaimana kompiler yang melakukan segmentasi pada "baik" itu? Itu <seharusnya tidak memiliki efek atau membungkus.
nyuszika7h

12
Segera menghasilkan kesalahan runtime pada pelanggaran batas adalah yang terbaik karena memungkinkan programmer menemukan dan memperbaiki bug secepat mungkin. Membiarkan program kereta berjalan untuk sementara waktu dan merusak memori sembarangan sebelum mogok hanya membuat masalah lebih sulit untuk didiagnosis. Mencegah kecelakaan sepenuhnya, seperti yang Anda sarankan, adalah yang terburuk; programmer dapat membuat program "bekerja" dan kemudian dipermalukan di depan umum ketika crash pada kompiler dan penerjemah standar.
Daniel Cristofani

1
Sebaliknya, menangkap pelanggaran batas sebelum runtime tidak dimungkinkan secara umum, atau khususnya berguna dalam kasus di mana dimungkinkan. Menghasilkan kesalahan runtime yang lebih deskriptif akan baik-baik saja, tetapi memiliki sistem operasi menangkapnya sebagai segfault sangat bagus karena tidak memiliki biaya kecepatan. (Jika tidak jelas, kompiler itu sendiri tidak segfault - ia menghasilkan executable yang segfault segera setelah mereka mencoba mengakses memori di luar batas.)
Daniel Cristofani

4
Bisakah Anda memberikan implementasi yang menghasilkan perilaku ini dan dibuat sebelum tantangan ini diposting? Jika tidak, jawaban ini tidak valid.
Mego

1
Batas pemeriksaan adalah implementasi spesifik, jadi saya yakin ada beberapa yang akan kesalahan di dalamnya. Akankah ada SIGSEGV? Aku meragukan itu. Ada sejumlah besar program yang bergantung pada pembungkus array ke kiri sekalipun. Bisa jadi lebih nyaman memiliki penyimpanan yang dapat tumbuh di kedua sisi.
captncraig

12

Haskell, 31

foreign import ccall main::IO()

Ini menghasilkan segfault ketika dikompilasi dengan GHC dan dijalankan. Tidak ada bendera ekstensi yang diperlukan, karena Antarmuka Fungsi Asing ada dalam standar Haskell 2010.


10

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

Versi C adalah:

*(int*)0=0;

Seluruh program (tidak cukup sesuai dengan ISO, mari kita asumsikan K&R C) adalah 19 karakter:

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

Varian Assembler:

orl $0,0

Seluruh program panjangnya 24 karakter (hanya untuk evaluasi, karena sebenarnya bukan assembler):

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

EDIT :

Beberapa varian C. Yang pertama menggunakan nol-inisialisasi variabel pointer global:

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

Yang kedua menggunakan rekursi tak terbatas:

main(){main();}

Varian terakhir adalah yang terpendek - 7 (15) karakter.

EDIT 2 :

Diciptakan satu varian lagi yang lebih pendek daripada yang di atas - 6 (14) karakter. Diasumsikan bahwa string literal dimasukkan ke dalam segmen read-only.

main(){*""=0;}

EDIT 3 :

Dan percobaan terakhir saya - 1 karakter:

P

Kompilasi saja seperti itu:

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

3
di C bukan main; hanya 5 charecters
Arya

1
: Linker tidak memeriksa apakah main berfungsi atau tidak. Itu hanya meneruskannya ke loader dan mengembalikan sigsegv
Arya

1
@ FuZxxl Dalam hal ini mainadalah variabel int global diinisialisasi nol, jadi apa yang kita dapatkan adalah hasil dari mencoba mengeksekusi beberapa byte nol. Di x86 itu akan menjadi sesuatu add %al,(%rax)yang merupakan instruksi yang benar-benar valid yang mencoba untuk mencapai memori di alamat yang disimpan %rax. Peluang memiliki alamat yang bagus ada sedikit.
Alexander Bakulin

6
Tentu saja entri terakhir dapat digunakan untuk semuanya, Anda hanya perlu menyediakan argumen kompiler yang tepat. Yang seharusnya menjadikannya pemenang otomatis dari setiap kontes kode golf. :-)
celtschk

5
Biasanya flag penyusun selain yang memilih versi bahasa yang akan digunakan dihitung terhadap total.
Jerry Jeremiah

9

dc - 7 karakter

[dx0]dx

menyebabkan stack overflow


Apakah berhasil, tetapi bisakah Anda menguraikan? Mengapa itu berlaku seperti itu?
Stéphane Gourichon

2
[dx0]menyimpan dx0di stack, lalu dmenduplikasi elemen tumpukan atas, lalu xmuncul elemen tumpukan atas ( dx0) dan menjalankannya. Yang menduplikasi elemen tumpukan atas, dan mulai menjalankannya ... 0perlu ada di sana untuk mencegah ini menjadi panggilan ekor, sehingga mereka semua membangun.
Ben Millwood

8

Perl, 10/12 karakter

Solusi yang sedikit curang adalah mencukur satu char dari trik bash Joey Adams :

kill 11,$$

Namun, untuk mendapatkan segfault nyata di Perl, unpack padalah solusi yang jelas:

unpack p,1x8

Secara teknis, ini tidak dijamin untuk segfault, karena alamat 0x31313131 (atau 0x313131313131313131 pada sistem 64-bit) mungkin saja menunjuk ke ruang alamat yang valid secara kebetulan. Tetapi kemungkinan besar menentangnya. Juga, jika perl pernah porting ke platform di mana pointer lebih panjang dari 64 bit, maka x8perlu ditingkatkan.


1
Benda apa ini 1x8?
Hannes Karppila

@HannesKarppila Ini adalah cara singkat untuk menulis"11111111".
Ilmari Karonen

8

Python 33

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

Mengirim sinyal 11 (SIGSEGV) dalam python.


2
Juga 33 karakter: from os import*dankill(getpid(),11)
Timtech

8

OCaml, 13 byte

Obj.magic 0 0

Ini menggunakan fungsi Obj.magic, yang memaksa dua jenis dengan tidak aman. Dalam hal ini, ia memaksa 0 (disimpan sebagai nilai langsung 1, karena bit tag yang digunakan oleh GC) ke tipe fungsi (disimpan sebagai pointer). Dengan demikian, ia mencoba untuk merujuk alamat 1, dan itu tentu saja akan segfault.


1
it coerces 0 (stored as the immediate value 1)- mengapa 0 disimpan sebagai 1?
Skyler 3-15

1
@ Skyler lihat edit
Demi

1
Obj.magic()0satu karakter lebih pendek :)
Ben Millwood

8

Bash, 4 byte

Golf

. $0

Secara rekursif memasukkan skrip ke dalam dirinya sendiri.

Dijelaskan

Operasi "sumber" (.) Rekursif akhirnya menyebabkan stack overflow, dan karena Bash tidak berintegrasi dengan libsigsegv , ini menghasilkan SIGSEGV.

Perhatikan bahwa ini bukan bug, tetapi perilaku yang diharapkan, seperti yang dibahas di sini .

Uji

./bang 
Segmentation fault (core dumped)

Cobalah secara Online!


8

Sebenarnya , 17 16 11 10 9 byte

⌠[]+⌡9!*.

Cobalah online!

Jika hal di atas tidak macet, coba tambah angkanya (angka multi-digit ditentukan dalam Sebenarnya dengan tanda titik dua)

Hancurkan interpreter dengan mengeksploitasi bug dalam python yang melibatkan itertools.chainobjek bersarang dalam , yang sebenarnya digunakan untuk mengimplementasikan +operator.


7

C # - 62

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

Edit: 23

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

Harus dikompilasi dengan / tidak aman agar yang ini berfungsi. Untuk beberapa alasan saya tidak mengerti, *(int*)0=0hanya melempar NullReferenceException, sementara versi ini memberikan pelanggaran akses yang tepat.


The int i=*(int*)0;kembali NullReferenceException bagi saya.
Peter Olson

Anda dapat mencoba mengakses lokasi negatif, suka *(int*)-1=0dan mendapatkan pelanggaran akses.
Peter Olson

Pengecualian khusus adalah apa yang dibungkus clr, dan tidak signifikan. Os itu sendiri sebenarnya memberikan kesalahan seg dalam semua kasus ini.
captncraig

Alasan mengapa *(int*)0=0melempar pengecualian kemungkinan karena optimasi. Khususnya, untuk menghindari biaya pemeriksaan null, pengoptimal dapat menghapus cek nol, tetapi ketika segfault terjadi, pengemasan ulang mungkin dianggap tepat NullReferenceException.
Konrad Borowski

7

PicoLisp - 4 karakter

$ pil
: ('0)
Segmentation fault

Ini adalah perilaku yang dimaksudkan. Seperti yang dijelaskan di situs web mereka:

Jika beberapa bahasa pemrograman mengklaim sebagai "Pisau Pemrograman Swiss Army", maka PicoLisp mungkin disebut "Pisau Bedah Pemrograman": Tajam, akurat, kecil dan ringan, tetapi juga berbahaya di tangan yang tidak berpengalaman.


7

F90 - 39 byte

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

Kompilasi:

gfortran segv.f90 -o segv 

Eksekusi:

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

Bahan:

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

1
Posting pertama yang bagus.
Rɪᴋᴇʀ

6

19 karakter dalam C

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

Ini merusak nilai alamat pengirim fungsi utama, sehingga mendapat SIGSEGV saat kembali dari main.


Itu tergantung pada susunan bingkai tumpukan, jadi dalam beberapa arsitektur mungkin tidak bisa gagal.
Alexander Bakulin

6

J (6)

memf 1

memfberarti memori bebas, 1diartikan sebagai pointer.


5

Cython, 14

Ini sering berguna untuk keperluan debugging.

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

5

Perakitan Unix PDP-11, biner 18 byte, sumber 7 byte

(Ini menjadi tema bagi saya, mungkin karena itu satu-satunya bahasa yang saya tahu tidak ada orang lain di sini.)

inc(r0)

Menambah byte tunggal yang dialamatkan oleh nilai awal r0 [yang kebetulan 05162 menurut simh debugger] pada saat program dimulai.

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

Dan, seperti biasa, byte asing di bagian akhir dapat dihapus dengan strip.

Saya melakukan beberapa upaya untuk mendapatkan sumber yang lebih pendek, tetapi selalu mendapatkan kesalahan sintaks atau SIGBUS.


5

Matlab - Ya itu mungkin!

Menanggapi pertanyaan saya, Amro mengajukan pertanyaan aneh ini:

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

Tolong beri versi Matlab - R2015B (dan 2016B juga) hanya melempar kesalahan: Kesalahan menggunakan setfield (baris 56) Setidaknya diperlukan satu indeks.
Florian Castellane

@FlorianCastellane Tidak dapat mencoba semua versi sekarang, tetapi telah dikonfirmasi untuk memberikan segfault di beberapa versi, yang terbaru adalah 2014b dan yang paling awal 2012a.
Dennis Jaheruddin

5

JavaScript Shell, 7 byte

clear()

Membersihkan segalanya, bukan hanya lingkup saat ini yang jelas menyebabkan banyak borks yang mengakibatkan JS meledak dan tersegmentasi


Menurut MDN (document.clear), ini seharusnya hanya melakukan sesuatu dalam versi Mozilla yang benar-benar lama, dan bahkan kemudian, apa yang benar-benar segfault dalam pengalaman Anda?
mulai

@tommeding ini adalah window.clear, FF secara langsung tidak mengungkapkannya, ini adalah built-in
spidermonkey

5

Pyth, 3 karakter

j1Z

Ini akan menjadi bagian di mana saya menjelaskan bagaimana saya mendapatkan jawaban ini, kecuali saya tidak memiliki petunjuk . Jika ada yang bisa menjelaskan ini untuk saya, saya akan berterima kasih.

Ini dia dalam juru bahasa online.

Penjelasan

jkuadratkan pangkalan dan menyebut dirinya secara rekursif sampai pangkalan setidaknya sama besar dengan jumlahnya. Karena basisnya 0 , itu tidak pernah terjadi. Dengan batas rekursi yang cukup tinggi, Anda mendapatkan segfault.

- Dennis ♦


Menemukan sesuatu! Dari penelusuran sumber Pyth, saya menemukan bahwa kode ini jaktif 1dan 0, yang mencoba mengubahnya 1menjadi basis 0. Mengapa segfaults, saya tidak tahu ...
NoOneIsHere

1
Lihat di sini . jkuadratkan pangkalan dan menyebut dirinya secara rekursif sampai pangkalan setidaknya sama besar dengan jumlahnya. Karena basisnya 0 , itu tidak pernah terjadi. Dengan batas rekursi yang cukup tinggi, Anda mendapatkan segfault.
Dennis

@Dennis IDEone
NoOneIsHere

@SeeRhino Juru bahasa Pyth menetapkan batas rekursi menjadi 100.000. Setidaknya di TIO, itu cukup untuk segfault.
Dennis
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.