Crash (mis. Menyebabkan interpreter berhenti bekerja dan memaksa tutup) Python [ditutup]

16

Saya ingin melihat siapa yang dapat membuat Python mengalami kerusakan fatal dengan kode paling kreatif. Ini berarti bahwa ketika program berjalan, Windows misalnya, akan mengambil alih dan muncul dengan sesuatu seperti "IDLE telah berhenti bekerja", atau Linux akan melakukan apa pun yang dilakukan Linux ketika sebuah program crash.

Aturan:

  1. Ini harus dibuat dengan Python 2.7 atau lebih tinggi (Jadi bug lama tidak dieksploitasi yang telah diperbaiki di versi Python yang akan datang).

  2. Definisi "crash" adalah "membuat IDLE atau Python keluar dengan cara yang tidak disengaja." Ini tidak berarti "membuat IDLE atau Python berhenti dan berikan traceback". Ini juga berarti keluar, sys.quit, batalkan dll bukan jawaban yang valid. Misalnya, ini tidak akan diterima:

    import sys
    try:
         print c # Crashes Here, as c is not defined.
     except NameError, SyntaxError:
         print "Oh No!"
         sys.exit()
    
  3. Membuat Python berhenti merespons tidak diterima.

  4. Kode harus dijelaskan tentang apa yang terjadi pada crash. Tautan ke laporan bug baik-baik saja.

Jawaban yang paling banyak dipilih setelah 10 hari menang! Mulai!!

EDIT: Boleh saya perjelas bahwa tujuannya bukan untuk membuat Python berhenti menjalankan program dengan traceback. Tujuannya adalah membuat Python benar-benar macet atau berhenti bekerja. Ini berarti bahwa jika tugas ini berhasil diselesaikan, Windows akan memberikan ini (Saya tidak menabrak Word di sini, itu hanya contoh apa yang harus terjadi untuk program yang berbeda):

dialog kesalahan

atau ini:

dialog kesalahan 2

George
sumber
1
Tantangan kode tag membutuhkan kriteria kemenangan yang objektif. Saya pikir sebagian besar kreatif tidak cukup objektif ...
Howard
Ok - Saya akan mengubahnya sesingkat mungkin, seperti kebanyakan tantangan lainnya .. Kreatif sebenarnya cukup ambigu ...
George
@ GeorgeH Jika kreatif adalah apa yang Anda cari, kontes popularitas bekerja dengan sempurna. Saya pribadi merasa ini yang terbaik sebagai kontes popularitas. Di masa depan, Anda dapat menjalankan pertanyaan Anda melalui kotak pasir di mana ketegaran ini dapat diselesaikan sebelum memposting.
Justin
2
@Orang dengan Rep Tinggi, prntpertanyaan saya disengaja.
George
6
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena pertanyaan ini meminta kode berbahaya.
AdmBorkBork

Jawaban:

18

Seharusnya kontes kode-golf;) - Saya kira kreativitas adalah pernyataan yang dibuat oleh kode: "Saya tidak tahu apa yang terjadi di sini ..."

Salin dan tempel karakter berikut di IDLE yang berjalan di Windows:

𐒢

Kecelakaan itu ada hubungannya dengan karakter yang dikodekan sebagai UTF-16 oleh Windows dan konversi yang gagal menjadi karakter UTF-8 oleh IDLE ...

Edit: python bug # 13153

David Herrmann
sumber
Saya tidak yakin apakah ini benar-benar jawaban yang valid. Pertanyaannya mengatakan "kapan program berjalan". Tapi di sini programnya tidak pernah benar-benar berjalan. IDLE lumpuh saat Anda hanya menempelkannya 𐒢, bahkan sebelum Anda dapat menjalankannya.
Sebastian Negraszus
Ya, saya harus setuju dengan @Sebastian. Dalam program Python Anda mulai dengan file teks dan menjalankan juru bahasa Python di atasnya, tetapi seharusnya tidak masalah bagaimana Anda membuat file teks.
David Z
1
Um ... puu.sh/7eVar.png
Oberon
Ini juga berfungsi pada Mac!
TheDoctor
19

ctypes penyalahgunaan:

import ctypes;ctypes.string_at(1)

Ini melemparkan 1 ke alamat dan referensi itu. Pada sistem waras mana pun (yaitu yang 0x00000001 bukan alamat yang dipetakan), ini akan segfault secara instan.

nneonneo
sumber
Di komputer saya, ini sepertinya tidak membuat crash penerjemah. Traceback dengan kesalahan WindowsError ditampilkan.
Dhara
@Dhara: Ah, itu akan menjadi pengendali pengecualian terstruktur dari ctypes yang menangkap crash. Saya yakin Anda dapat menabrak Python ctypesdi Windows dengan cara lain, tetapi mungkin tidak dalam beberapa karakter.
nneonneo
12

60

import sys
sys.setrecursionlimit(1<<30)
f=lambda f:f(f)
f(f)

Bukan ide saya sendiri. Disalin dari Python Wiki di sini .

Ini menyebabkan rekursi tak terbatas, dan tidak dihentikan oleh penerjemah karena kami mengubah batas rekursi.

pengguna12205
sumber
Terima kasih - ini adalah jawaban yang bagus, tetapi untuk pertanyaan yang salah! Tujuannya belum diklarifikasi dalam pertanyaan. Terima kasih atas jawaban Anda.
George
2
@ George H Maaf saya tidak menggunakan mesin Windows sekarang, tetapi bukankah kesalahan segmentasi yang menyebabkan interpreter python untuk membuang inti cukup? i.imgur.com/5gSGBpr.png
user12205
10

signal penyalahgunaan (bukan Windows):

import os;os.kill(0,4)

Pada kebanyakan sistem (di mana SIGILL = 4) ini akan membunuh Python dengan kesalahan "instruksi ilegal".

Atau Anda dapat mematikan program menggunakan jam alarm pembunuh :

import signal;signal.alarm(1)

Setelah satu detik, Python mati dengan pesan samar "Jam alarm".

nneonneo
sumber
Kode sinyal karakter tunggal lainnya yang berfungsi termasuk 1, 3, 5, 6, 8 dan 9.
user12205
9

Dalam Python 3.3:

exec(type((lambda:0).__code__)(0,1,0,0,0,b'',(),(),(),'','',1,b''))

Dalam Python 2.7 objek kode sedikit berbeda:

exec type((lambda:0).func_code)(0,1,0,0,'Q',(),(),(),'','',0,'')

Ya, Anda dapat meneruskan semua sampah lama ke juru kode byte dan menjalankannya ( masalah Python # 17187 ).


sumber
Lebih pendek (Python 2.x):exec type((lambda:0).func_code)(0,1,0,0,'Q',(),(),(),'','',0,'')
nneonneo
Terima kasih! Dan dengan Python 3 kita bisa menggunakan .__code__.
6

Iterator rekursif menggunakan tumpukan C, bukan tumpukan Python ( edisi # 14010 dan edisi # 14507 ):

i=''
for _ in range(9**6):i=filter(int,i)
del i

sumber
Ini tidak menabrak Python 2.7.11 di Mac saya, tetapi ia menabrak Python 3.5.1.
nneonneo
4

Salah satu cara mudah untuk menghentikan juru bahasa adalah dengan menjebaknya agar tidak melakukan deallocating.

import ctypes, sys
(ctypes.c_char*4).from_address(id(None))[:] = '\0'*4

Sebagai bonus, inilah cara cerdas untuk memisahkan Python 2:

import ctypes, struct, sys
inner = ()
outer = (inner,)
c_outer = (ctypes.c_char * sys.getsizeof(outer)).from_address(id(outer))
inner_index = c_outer[:].find(struct.pack('P', id(inner)))
c_outer[inner_index:inner_index+struct.calcsize('P')] = struct.pack('P', id(outer))
print outer

Apa yang sebenarnya dilakukan ini dibiarkan sebagai latihan bagi pembaca.

Fraxtil
sumber
2
Yang pertama: atur refcount dari None ke nol, menyebabkannya dialokasikan secara meriah. Yang kedua: buat dan cetak tupel referensi-sendiri.
nneonneo
3

Seseorang mengira mereka dapat mencegah FlagsTypeobjek baru dibuat oleh pengaturan FlagsType.tp_new = NULL, tetapi mereka lupa untuk menghapus metode ( masalah # 13204 ):

import sys
t=type(sys.flags)
t.__new__(t)

( sys.version_infomemiliki bug yang sama.)


sumber
3

Penggunaan modul allocain ctypes( edisi # 13096 ):

from ctypes import *
POINTER('a'*9**8)

sumber
0

Salah satu cara yang mungkin menabrak Python saya dengan MemoryError:

x=[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
Penglihatan
sumber
2
Ini tidak berfungsi untuk saya - itu hanya membuat Python berhenti dengan MemoryError. Itu perlu ditutup oleh OS.
George
2
Hah. Kesalahan terjadi pada kedalaman yang sangat dangkal.
user2357112 mendukung Monica