Tulis kode legal yang sempurna dalam bahasa pilihan Anda yang kompilasi akan membuat crash kompilator atau mengirimkannya ke infinite loop (waktu kompilasi tak terbatas).
Pembatasan:
- Gunakan bahasa standar yang digunakan di dunia nyata.
- Gunakan kompiler standar yang dikembangkan dengan baik (tidak ada jawaban seperti "Saya menulis kompiler C saya yang macet dalam segala hal").
- Kode harus legal dalam bahasa (jadi kemungkinan besar Anda harus mengeksploitasi kompiler atau bug bahasa).
- Berikan versi kompiler Anda dan opsi yang digunakan sehingga orang lain dapat menggandakannya.
- Jelaskan mengapa kompiler macet, jika mungkin.
Selamat bersenang-senang :)
popularity-contest
compile-time
Petr Pudlák
sumber
sumber
Jawaban:
Saya cukup yakin itu sudah diperbaiki sekarang, tetapi dulu Anda bisa membuat crash compiler Java (atau, crash Eclipse) dengan menulis
http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
Sebenarnya, menurut halaman itu, kompiler hanya akan hang, bukan crash. Tetap saja, saya pikir itu cukup menyenangkan.
sumber
Solusi favorit saya untuk GHC:
Untuk GHC 6.12.1 keduanya
ghci Bad.hs
danghc Bad.hs
loop tanpa batas. GHC 7.4.1 loop tanpa batas ketikaghc -O2 Bad.hs
dijalankan.Penjelasan:
omega
didefinisikan menggunakan rekursi tak terbatas (satu-satunya cara ia dapat menghuni jenis apa pun). Inliner kompiler melihatxx
sebagai fungsi sederhana, non-rekursif, jadi ia mencoba untuk menyelaraskannya dalam definisiomega
. Ini menghasilkan(\x@(C x') -> x' x) (C xx)
. Melihat kecocokan pola pada konstruktor, kompiler mencoba menguranginya, mendapatkanxx (C xx)
lagi, dan mengulang. Kuncinya adalah yangxx
sebenarnya rekursif, tetapi rekursi tersembunyi dalam tipe data.Catatan: Saat menulis puzzle, saya lupa saya membiarkan GHC berjalan di loop yang tak terbatas. Butuh semua memori saya, crash Firefox dan saya nyaris tidak berhasil membunuhnya tanpa hard reset.
sumber
Ini mudah dalam bahasa yang diketik secara dependen . Tipe-pengecekan tipe dependen umum tidak dapat ditentukan karena mungkin memerlukan perhitungan kompleks yang arbitrari (Turing-complete). Anda cukup menyandikan dalam tipe dependen nilai terlalu besar. Kemudian pemeriksa tipe akan menggunakan semua memori yang tersedia dan crash. Sebagai contoh, dalam Coq, ReyCharles memberikan contoh
Compute 70000.
, yang menyebabkan pemeriksa tipe membangun angka Peano raksasa dan crash.Dalam bahasa yang lebih umum yang mendukung semacam ekspansi makro atau pemrograman, Anda dapat melakukan hal serupa. Misalnya, Anda dapat menggunakan semua memori yang tersedia di C:
Bahasa pemrograman D memungkinkan eksekusi fungsi waktu kompilasi . Ini dapat digunakan untuk menghitung sesuatu pada waktu kompilasi yang terlalu besar untuk muat dalam memori. Sesuatu yang serupa dapat dicapai dengan menggunakan metaprogramming template C ++.
Dalam XML (bukan bahasa pemrograman yang dikompilasi, tetapi prosesor XML analog dengan kompiler), entitas yang berkembang dapat membuat prosesor kehabisan memori:
Ini disebut serangan tertawa milyaran .
sumber
<lolz>&lol999;</lolz>
10 ^ 999 tertawa, bukan satu miliar. Referensi yang ditautkan menggunakan<lolz>&lol9;</lolz>
, yang sebenarnya satu miliar.C #
Menemukan ini di pertanyaan stackoverflow :
Kompiler pada akhirnya akan macet.
Masalah ini tampaknya terkait dengan inferensi tipe dan / atau generasi lambda dikombinasikan dengan resolusi kelebihan.
sumber
VBA
bagaimana kalau Anda bisa crash IDE dengan mengetikkan kode?
di aplikasi Microsoft Office apa pun, coba ini:
ALT+ F11untuk membuka jendela VBA, lalu coba kode berikut
dan lihat:
Anda cukup mengetik
redim preserve v(,1 to 5)
ke jendela langsung, dan itu akan macet setelah Anda menekan ENTER!sumber
,
dan diharapkan,
)Perl (15)
Ini menciptakan loop tak terbatas pada waktu kompilasi :
(dari perlmod )
Dan itu sebabnya Perl tidak dapat menyelesaikan parsing kode. Ini tidak berakhir:
sumber
J
Segfaults juru bahasa J (setidaknya di Linux):
Mencoba membaca dari alamat memori 2. Menariknya, jika Anda mencobanya dengan 0 atau 1, Anda dapatkan
domain error
.sumber
TeX
TeX adalah bahasa ekspansi makro. Di sini kami mendefinisikan ekspansi makro
\x
menjadi\x
lagi, dan kemudian kami menambahkan setelah doa\x
. TeX terjebak tanpa henti mengganti\x
dengan\x
.sumber
Skema
Kompiler saya, Chicken, membuat kesalahan dengan mencoba memperluas makro pada waktu kompilasi untuk "kinerja run-time" atau sesuatu. Jadi itu membayar harga ekspansi yang satu ini. Saya sudah membaca R5RS. Tidak ada yang mengatakan makro harus diperluas pada waktu kompilasi.
Pada dasarnya apa yang terjadi adalah makro memperluas ekspresi ukuran tak terbatas, terus-menerus menggandakan ukuran. Nah, untuk teknis, menggandakan setiap ekspansi lainnya. Nasib kompilator tersegel. Setidaknya pada sistem saya, tutup Ayam di 2GB, kios untuk waktu yang lama mencoba mengumpulkan sampah, lalu macet setelah pengumpul sampah menyerah. Memang butuh beberapa saat karena semua keajaiban higienis yang mahal secara komputasi terjadi.
Beralih di antara ekspresi bentuk
dan
tampaknya sangat, sangat dramatis meningkatkan tingkat konsumsi memori dibandingkan dengan:
Saya menduga Chicken adalah kompiler yang cukup tangguh yang memiliki beberapa cara untuk menghindari analisis mendalam dari ekspresi sintaksis ketika bisa lolos begitu saja, tetapi solusi terakhir saya memaksa pencocokan pola untuk benar-benar menyelam.
sumber
@wizzwizz4
.Gangguan umum
Makro membuatnya mudah:
Mengkompilasi
compile-me
panggilanloop-forever
, yang menghabiskan memori tumpukan selama ekspansi dan membuat crash kompilator. Jika Anda hanya ingin membuat kompiler digantung tanpa batas waktu, maka definisi iniloop-forever
akan melakukannya:Ini harus bekerja menggunakan implementasi CL apa pun, kecuali jika Anda sangat pintar dan dapat mendeteksi loop tak terbatas sederhana, tapi saya sangat ragu ada yang melakukan ini. Perlindungan penuh terhadap ini tidak mungkin, tentu saja.
sumber
(defmacro loop-forever () (loop)) (defun compile-me () (loop-forever))
harus cukup. Hang CCL untuk saya.PHP 5.3.1 (Interpreter Segfaults) ( Bug 50261 , diperbaiki pada 5.3.3)
Yang ini sedikit masalah, karena kode di atas adalah umum dalam banyak kode yang saya kerjakan, membuat ini masalah yang cukup luas bagi kami.
(Jika saya ingat dengan benar, pada satu titik ini adalah satu-satunya cara untuk memanggil konstruktor induk dalam PHP.)
sumber
D
(DMD32 D Compiler v2.067.1, Windows build)
Perhatikan bahwa ini akan mengirim kompiler ke loop infinite dan crash.
Mekanik siput menunjukkan bahwa fitur pemrograman waktu kompilasi dalam D dapat disalahgunakan untuk tujuan ini, tetapi solusinya mungkin lebih sederhana daripada jenis teknik yang ada dalam pikirannya.
Bagi mereka yang tidak terbiasa dengan 'string mixin', ini adalah fitur makro yang cukup mudah. Ketika kompilator bertemu
mixin("asdf")
, itu menggantikannya dengan isi stringasdf
,, dan mencoba untuk mengkompilasinya lagi.Solusi di atas akan diperluas seperti:
Jadi kecuali jika kompiler mencoba untuk mendeteksi kasus ekspansi-ke-yang sama ini, ia akan memasuki loop ekspansi tanpa batas.
sumber
Perl
Ini mendefinisikan operator kelebihan pada waktu kompilasi, dan menjalankan kode pada waktu kompilasi yang menambahkan instance kelas bersama-sama.
(Omong-omong, rekursi yang biasanya tak terbatas akan memakan semua memori, tetapi dengan kelebihan beban, itu hanya crash)
Keluaran:
sumber
Simplex v.0.5 , 2 byte
Sayang sekali ini bukan kode-golf :
Biarkan saya jelaskan. Dari dokumen:
Begitu:
Program luar adalah fitur kecil yang rapi di Simplex: itu dievaluasi pada akhir program. Jadi, jika kita terus melacak ...:
Akhirnya, memori akan habis dan dunia akan berakhir.
sumber
Dentang ++
Saya baru saja menemukan bug yang menyenangkan ini.
Tujuannya adalah untuk menerjemahkan Brainfuck ke dalam C, menggunakan template meta-programming untuk melakukan sebagian besar pekerjaan. Kode ini berfungsi untuk program Brainfuck yang lebih kecil, seperti Hello World, tetapi ketika saya mencoba menjalankannya dengan 99 Botol ...
Ini akan berhasil dikompilasi dalam GCC (setelah sekitar 2 menit), tetapi menautkannya menyebabkan masalah lain ...
Ups.
sumber
Smalltalk (Dialek mencicit, versi 4.x)
Sangat mudah, cukup evaluasi ini, atau terima metode dengan literal ini
Ini akan mencoba untuk mengevaluasi kekuatan 10 dalam aritmatika Bilangan Besar, hanya untuk pembulatan inf Tsss;)
Sunting: berapa banyak 9 yang diperlukan?
Karena 2 ^ 10 adalah 1024, kira-kira 10 ^ 3, kita dapat memperkirakan sekitar 10 ^ n x 2 ^ (10 * n / 3). Itu berarti bahwa 10 ^ n membutuhkan 10 * n / 3 bit untuk direpresentasikan dalam biner. Kami ingin agar 10 tidak dapat diwakili.
Dengan asumsi pointer 32 bit untuk memori objek, kita tahu bahwa kita tidak dapat mengatasi lebih dari 2 ^ 32 byte, yaitu 2 ^ 35 bit. Jadi mari kita balikkan masalahnya: 2 ^ 35 kira-kira 32 * 2 ^ 30, 32 * 10 ^ 9. Itu membutuhkan sekitar 11 angka desimal, jadi dengan sebelas 9, kami yakin akan menghasilkan kesalahan pada mencicit 32bit. Dalam 64 bit itu akan menjadi dua puluh satu 9.
Kita juga dapat menghabiskan memori dengan 9s lebih sedikit, seluruh ruang yang dapat dialamatkan belum tentu tersedia, tetapi sangat lambat untuk diuji, Squeak VM tidak dioptimalkan untuk aritmatika raksasa seperti GMP.
sumber
9
?Ini adalah metode asli dan ringkas saya untuk membuat crash GolfScript:
Apa yang dilakukan adalah mengatur loop selamanya yang terus mendorong 1 ke tumpukan sampai memori habis.
Dalam C / C ++, saya percaya bahwa potongan kode asli ini akan membuat crash kompilator:
Ini akan membuat kompiler macet menggandakan jumlah a dan mengubahnya menjadi b's dan sebaliknya, sehingga kompiler akan segera kehabisan memori dan crash.
Satu lagi adalah untuk batch pada Windows, jika benar-benar membekukan komputer daripada hanya script batch itu sendiri yang diperhitungkan. Anda harus mengetikkan yang berikut:
Ini masuk ke lingkaran tak terbatas membuat salinan sendiri, yang membuat salinan diri mereka sendiri dan seterusnya. Ini kemungkinan besar pada akhirnya akan merusak komputer Anda jika Anda menjalankan sedikit kode ini.
Yang terakhir adalah bom VBS. Ini adalah bom lain, seperti yang terakhir, tetapi malah membuka kotak dialog dalam jumlah tak terbatas.
Ini secara terus-menerus membuat salinan dirinya sendiri dan membuka kotak pesan dalam loop tak terbatas, yang juga dilakukan oleh klon. Menjalankan dua program terakhir ini tidak dianjurkan, karena mereka dapat membekukan komputer Anda dan menyebabkan Anda harus mem-boot komputer Anda.
Perhatikan bahwa saya membuat sendiri semua program ini.
sumber
Gangguan Umum, 8 byte
Lebih pendek dari jawaban Common Lisp lainnya :-)
Ulangi saat membaca formulir Anda.
Standar Common Lisp tidak menyebutkan cara portabel untuk membuatnya crash, jadi saya kira kita perlu memiliki cara yang ditentukan implementasi. Masih 8 byte:
... atau,
Saat Anda menelepon
(compile-file "crash.lisp")
, lingkungan secara misterius "macet".Bercanda terpisah, saya masih berusaha menemukan cara untuk benar-benar merusak lingkungan (dan sebentar lagi), tetapi itu sangat sulit. Yang saya dapatkan adalah interaksi yang bagus dengan debugger.
sumber
x86 asm
"nasm -v" mengembalikan "NASM versi 2.11.08 dikompilasi pada 21 Feb 2015" (Saya menjalankannya di bawah win7)
Assembler telah berjalan untuk 1:12:27 sejauh ini pada i7, benar-benar jenuh salah satu core. File output duduk pada 0 byte, konsumsi memori telah stabil pada 1.004K - tampaknya aman untuk mengatakan saya sudah dipukuli habis-habisan, daripada hanya memberikannya tugas yang sangat, sangat lama. :)
Kunci triknya adalah nilai repeat di makro - 0xFFFFFFFF. Meski begitu, aku tidak cukup akrab dengan bagian dalam Nasm untuk mengetahui mengapa sebenarnya hal ini membuatku tercekik. Saya berharap untuk mendapatkan output ~ 16GB satu jam yang lalu.
EDIT: Baru saja memeriksa task manager, Nasm telah berjalan selama 7:40:41 dan memori sekarang mencapai 1.016K
sumber
Gnu assembler, menghasilkan file keluaran besar
Makro ini berupaya mengisi file keluaran dengan sampah (biasanya nol byte) hingga batas 4 GB tercapai, menambahkan int untuk melewati batas itu, dan secara rekursif memanggil dirinya sendiri untuk tetap mengisi output dengan potongan sampah 4 GB. Ini akan mengisi hard drive Anda sampai penuh, pada titik mana assembler kemungkinan akan crash.
Perhatikan bahwa rekursi tak terbatas tidak dapat digunakan, karena assembler akan menangkap kasing khusus itu dan berhenti memperluas makro.
Kompilasi dapat dilakukan dengan
as -o crash.out crash.s
sebagian besar distribusi Linux.sumber
Gangguan Umum, 29 byte
Implementasi: Clozure CL
PERINGATAN: Hati-hati saat menjalankan kode ini, ini dapat mematikan proses yang tidak Anda inginkan!
Ini menjalankan perintah shell
pkill cl
pada waktu kompilasi, yang akan membunuh proses Lisp melakukan kompilasi. Secara teknis tidak crash, tetapi memiliki efek yang sama.Contoh penggunaan:
sumber
Felix
Ini tidak berfungsi lagi, tetapi pada satu titik, kode ini:
Ini akan memberikan kesalahan besar:
SISTEM KEGAGALAN bind_expression 'mengangkat Not_found [BUG] Kompilasi Felix "/ media / ryan / stuff / felix / build / release / host / bin / flxg" "-q" "--optimise" "--inline = 100" "- - output_dir = / home / ryan / stuff / .felix / text "" --cache_dir = / home / ryan / stuff / .felix / cache "" -I / media / ryan / stuff / felix / build / release / share / lib "" -I / media / ryan / stuff / felix / build / release / host / lib "" --syntax=@/media/ryan/stuff/felix/build/release/share/lib/grammar/grammar.files " "--automaton = / home / ryan / stuff / .felix / cache / media / ryan / stuff / felix / build / release / share / lib / grammar / grammar.files / syntax.automaton" "- impor = plat / flx.flxh "" std "" /home/ryan/golf/itri/sl.flx "gagal Kesalahan 1 di flx: [strerror_r] Gagal menemukan teks untuk kesalahan nomor 1
Masalahnya ada di sini:
let
mengharapkan ekspresi untuk mengikutinya, tapi aku malah memberikan pernyataan. Jadi kompiler itu sedikit ketakutan.Info lebih lanjut di https://groups.google.com/forum/m/#!topic/felix-language/J3Hs4j6E0gM .
sumber
JavaScript
Ini mengirimkannya ke loop tak terbatas. Saya menggunakan kompiler Codecademy JS dan itu crash browser saya.
sumber
while(1){}
; ini juga merupakan infinite loop.while(1);
.Javascript
Yang satu ini membuat browser web mogok dengan sangat efektif. GUNAKAN RISIKO ANDA SENDIRI !!!
sumber
Hassium
File1.has:
File2.has:
Ini menyebabkan Hassium memuat dan mulai mengkompilasi File2.has, yang memerintahkannya untuk memuat File1.has, yang menyebabkannya untuk memuat File2.has, dan seterusnya.
sumber
LOLCODE 1.2, LOLCODE Penerjemah / Kompiler Umum (lci)
Saya tahu ini bukan kode-golf tetapi sangat singkat.
Ini menyebabkan Sinyal 11:
Mengapa?
HAI1.2
menunjukkan awal program, danOBTW
memulai komentar multiline. Tetapi kompiler mengharapkan aKTHXBYE
untuk menutupHAI
, danTLDR
untuk menutup komentar multiline.Perhatikan bahwa ini masih akan berfungsi untuk menyebabkan segfault dengan selain dari
TLDR
setelahOBTW
.(Menurut standar wikipedia , LOLCODE hanyalah sebuah Weirdlang, bukan benar-benar esoterik.)
Anda dapat mengambil penerjemah dari git / justinmeza / lci .
sumber