Tulis kode terpendek yang memunculkan Kesalahan Segmentasi (SIGSEGV) dalam bahasa pemrograman apa pun.
75
Tulis kode terpendek yang memunculkan Kesalahan Segmentasi (SIGSEGV) dalam bahasa pemrograman apa pun.
Jawaban:
C, 5 karakter
Ini adalah deklarasi variabel -
int
jenis tersirat (fitur disalin dari bahasa B) dan0
merupakan nilai default. Ketika dieksekusi ini mencoba untuk mengeksekusi angka (angka tidak dapat dieksekusi), dan menyebabkanSIGSEGV
.Cobalah online!
sumber
0
.static
variabel mulai sebagai0
, danmain;
adalahstatic
, seperti yang saya menyatakan fungsi luar. c-faq.com/decl/initval.htmlmain
int, itu terletak di.bss
, biasanya fungsi terletak di.text
, ketika kernel memuat program elf itu membuat halaman yang dapat dieksekusi untuk.text
dan 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.main __attribute__((section(".text#")))=0xc3;
FTFY (setidaknya tampaknya kembali tanpa menabrak x86 saya).const main=195;
,. Yang menarik adalah bahwa itu berfungsi, tujuan dari tantangan golf kode ini adalah untuk membuat kode segfault, bukan bekerja :).Bash, 11
sumber
Majelis (Linux, x86-64), 1 byte
Kode ini segfault.
sumber
Python 2, 13
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.
sumber
Segmentation fault: 11
di MacSegmentation fault (core dumped)
di LinuxpdfTeX (51)
Ini sebenarnya mungkin bug , tetapi tidak ada dalam TeX asli, yang ditulis oleh Knuth: kompilasi kode dengan
tex filename.tex
bukannyapdftex filename.tex
tidak menghasilkan segfault.sumber
LOLCODE, 4 byte
Tidak bekerja online, hanya di C juru bahasa.
sumber
Python, 33 karakter
Sumber: http://bugs.python.org/issue1215#msg143236
Python, 60 karakter
Sumber: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup
Ini adalah versi Python yang saya uji pada:
Secara umum interpreter Python sulit untuk crash, tetapi di atas adalah kekerasan selektif ...
sumber
Keempat - 3 karakter
(
@
mengambil)sumber
C, 18
sumber
int func()
. yaitu fungsi yang mengembalikanint
, mengambil parameter yang tidak ditentukan. Dalam hal iniraise
adalah fungsi mengembalikan int, mengambil argumen int, jadi ini berhasil (bahkan jika kompiler mengeluh).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.
sumber
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).
sumber
brainfuck (2)
Ya, ini tergantung pada implementasi. SIGSEGV kemungkinan merupakan hasil dari kompiler yang baik.
sumber
<
seharusnya tidak memiliki efek atau membungkus.Haskell, 31
Ini menghasilkan segfault ketika dikompilasi dengan GHC dan dijalankan. Tidak ada bendera ekstensi yang diperlukan, karena Antarmuka Fungsi Asing ada dalam standar Haskell 2010.
sumber
C -
11 (19)7 (15)6 (14)1 karakter, AT&T x86 assembler - 8 (24) karakterVersi C adalah:
Seluruh program (tidak cukup sesuai dengan ISO, mari kita asumsikan K&R C) adalah 19 karakter:
Varian Assembler:
Seluruh program panjangnya 24 karakter (hanya untuk evaluasi, karena sebenarnya bukan assembler):
EDIT :
Beberapa varian C. Yang pertama menggunakan nol-inisialisasi variabel pointer global:
Yang kedua menggunakan rekursi tak terbatas:
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.
EDIT 3 :
Dan percobaan terakhir saya - 1 karakter:
Kompilasi saja seperti itu:
sumber
main
adalah variabel int global diinisialisasi nol, jadi apa yang kita dapatkan adalah hasil dari mencoba mengeksekusi beberapa byte nol. Di x86 itu akan menjadi sesuatuadd %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.dc - 7 karakter
menyebabkan stack overflow
sumber
[dx0]
menyimpandx0
di stack, lalud
menduplikasi elemen tumpukan atas, lalux
muncul elemen tumpukan atas (dx0
) dan menjalankannya. Yang menduplikasi elemen tumpukan atas, dan mulai menjalankannya ...0
perlu ada di sana untuk mencegah ini menjadi panggilan ekor, sehingga mereka semua membangun.Perl, 10/12 karakter
Solusi yang sedikit curang adalah mencukur satu char dari trik bash Joey Adams :
Namun, untuk mendapatkan segfault nyata di Perl,
unpack p
adalah solusi yang jelas: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
x8
perlu ditingkatkan.sumber
1x8
?"11111111".
Python 33
Mengirim sinyal 11 (SIGSEGV) dalam python.
sumber
from os import*
dankill(getpid(),11)
OCaml, 13 byte
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.sumber
it coerces 0 (stored as the immediate value 1)
- mengapa 0 disimpan sebagai 1?Obj.magic()0
satu karakter lebih pendek :)Bash, 4 byte
Golf
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
Cobalah secara Online!
sumber
Sebenarnya ,
17 16 11 109 byteCobalah 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.chain
objek bersarang dalam , yang sebenarnya digunakan untuk mengimplementasikan+
operator.sumber
C # - 62
Edit: 23
Harus dikompilasi dengan / tidak aman agar yang ini berfungsi. Untuk beberapa alasan saya tidak mengerti,
*(int*)0=0
hanya melempar NullReferenceException, sementara versi ini memberikan pelanggaran akses yang tepat.sumber
int i=*(int*)0;
kembali NullReferenceException bagi saya.*(int*)-1=0
dan mendapatkan pelanggaran akses.*(int*)0=0
melempar pengecualian kemungkinan karena optimasi. Khususnya, untuk menghindari biaya pemeriksaannull
, pengoptimal dapat menghapus cek nol, tetapi ketika segfault terjadi, pengemasan ulang mungkin dianggap tepatNullReferenceException
.PicoLisp - 4 karakter
Ini adalah perilaku yang dimaksudkan. Seperti yang dijelaskan di situs web mereka:
sumber
F90 - 39 byte
Kompilasi:
Eksekusi:
Bahan:
sumber
19 karakter dalam C
Ini merusak nilai alamat pengirim fungsi utama, sehingga mendapat SIGSEGV saat kembali dari
main
.sumber
J (6)
memf
berarti memori bebas,1
diartikan sebagai pointer.sumber
Cython, 14
Ini sering berguna untuk keperluan debugging.
sumber
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.)
Menambah byte tunggal yang dialamatkan oleh nilai awal r0 [yang kebetulan 05162 menurut simh debugger] pada saat program dimulai.
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.
sumber
Matlab - Ya itu mungkin!
Menanggapi pertanyaan saya, Amro mengajukan pertanyaan aneh ini:
sumber
JavaScript Shell, 7 byte
Membersihkan segalanya, bukan hanya lingkup saat ini yang jelas menyebabkan banyak borks yang mengakibatkan JS meledak dan tersegmentasi
sumber
Pyth, 3 karakter
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.
sumber
j
aktif1
dan0
, yang mencoba mengubahnya1
menjadi basis0
. Mengapa segfaults, saya tidak tahu ...j
kuadratkan 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.