Çökme (yani yorumlayıcının çalışmayı durdurmasına ve kapanmaya zorlamasına) Python [kapalı]


16

Kim en yaratıcı kod ile ölümcül bir çökme Python yapabilir görmek istiyorum. Bu, program çalıştırıldığında, örneğin Windows'un “IDLE çalışmayı durdurdu” gibi bir şeyi devralacağı ve açılacağı veya bir program çöktüğünde Linux'un yaptığı her şeyi yapacağını gösterir.

Kurallar:

  1. Bu Python 2.7 veya üstü ile yapılmalıdır (Python'un gelecekteki sürümlerinde düzeltilen eski hatalardan yararlanılmamaktadır).

  2. "Çökme" tanımı "IDLE veya Python'dan istemeden çıkış yap" dır. Bu "IDLE veya Python'u durdurun ve bir geri izleme yapın" anlamına gelmez. Bu ayrıca exit, sys.quit, abort vb. Öğelerinin geçerli yanıtlar olmadığı anlamına gelir. Örneğin, bu kabul edilmeyecektir:

    import sys
    try:
         print c # Crashes Here, as c is not defined.
     except NameError, SyntaxError:
         print "Oh No!"
         sys.exit()
    
  3. Python'un yanıt vermeyi durdurması kabul edilmez.

  4. Kod, çökmek için ne yaptığı konusunda açıklanmalıdır. Bir hata raporunun bağlantısı iyidir.

10 gün sonra en çok oylanan cevap kazanır! Başla!!

DÜZENLEME: Hedefin Python'un programı bir geri izleme ile yürütmeyi durdurmasını sağlamak olmadığını açıkça belirtebilir miyim? Amaç Python'un tamamen çökmesini veya çalışmasının durdurulmasıdır. Bu, bu görev başarıyla tamamlanırsa, Windows bunu verir (Word'ü burada çökmüyorum, sadece farklı bir program için ne olması gerektiğine bir örnek):

hata diyalogu

veya bu:

hata diyalogu 2


1
Tag -challenge etiketi , objektif kazanma kriteri gerektirir. Sanırım en yaratıcı yeterince objektif değil ...
Howard

Tamam - Mümkün olduğunca kısa olarak değiştireceğim, diğer birçok zorluk gibi ... Yaratıcı aslında oldukça belirsiz ...
George

@GeorgeH Yaratıcı aradığınız şeyse, popülerlik yarışması mükemmel bir şekilde çalışır. Şahsen bunun bir popülerlik yarışması olarak en iyisi olacağını hissediyorum. Gelecekte, sorunuzu göndermeden önce bu karışıklıkların çözülebileceği sanal alan üzerinden çalıştırabilirsiniz .
Justin

2
@Yüksek Temsilci olan insanlar, benim prntsorularım kasıtlı.
George

6
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum çünkü bu soru kötü amaçlı kod istiyor.
AdmBorkBork

Yanıtlar:


18

Bir kod golf yarışması olmalıydı;) - Sanırım yaratıcılık, kodun yaptığı açıklamadır: "Burada ne olduğunu bilmiyorum ..."

Windows'ta çalışan IDLE'de aşağıdaki karakteri kopyalayıp yapıştırın :

𐒢

Çökme, karakterin Windows tarafından UTF-16 olarak kodlanması ve IDLE tarafından UTF-8 karakterine başarısız dönüşüm ile ilgili bir şey var ...

Düzenleme: python hatası # 13153


Bunun gerçekten geçerli bir cevap olup olmadığından emin değilim. Soru "program çalıştığında" yazıyor. Ama burada program asla gerçekten çalıştırılmaz. IDLE 𐒢, yalnızca çalıştırmadan önce yapıştırdığınızda çöker .
Sebastian Negraszus

Evet, @Sebastian ile hemfikirim. Bir Python programında bir metin dosyasıyla başlarsınız ve Python yorumlayıcısını çalıştırırsınız, ancak metin dosyasını nasıl yaptığınız önemli değildir.
David Z


Mac'te de çalışıyor!
TheDoctor

19

ctypes taciz:

import ctypes;ctypes.string_at(1)

Bu, 1'i bir adrese çevirir ve adresini kaldırır. Herhangi bir aklı başında sistemde (yani 0x00000001'in eşlenmiş bir adres olmadığı bir sistemde), bu anında anında bölümlere ayrılır.


Makinemde bu, tercümanı çökertmiyor gibi görünüyor. WindowsError hatası olan bir geri izleme görüntülenir.
Dhara

@Dhara: Ah, bu ctypes'in kazayı yakalayan yapılandırılmış istisna işleyicisi olurdu. Python'u ctypesWindows'ta başka bir şekilde çökerttiğinizden eminim , ancak belki de çok az karakterle değil.
nneonneo

12

60

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

Benim fikrim değil. Burada Python Wiki'den kopyalandı .

Bu sonsuz bir yinelemeye neden olur ve yineleme sınırını değiştirdiğimiz için yorumlayıcı tarafından durdurulmaz.


Teşekkürler - bu harika bir cevap, ama yanlış soru için! Soruda hedef açıklığa kavuşmamıştır. Yine de cevabınız için teşekkürler.
George

2
@George H Üzgünüm, şimdi bir Windows makinesi kullanmıyorum, ancak python yorumlayıcısının çekirdeği yeterince boşaltmasına neden olan bir segmentasyon hatası değil mi? i.imgur.com/5gSGBpr.png
user12205 27:14

10

signal kötüye kullanım (yalnızca Windows olmayan):

import os;os.kill(0,4)

Çoğu sistemde (üzerinde SIGILL = 4 olan) Python'u "geçersiz talimat" hatasıyla öldürür.

Veya katil çalar saatini kullanarak programı öldürebilirsiniz :

import signal;signal.alarm(1)

Bir saniye sonra, Python şifreli "Alarm clock" mesajı ile ölür.


Diğer tek karakterli sinyal kodları 1, 3, 5, 6, 8 ve 9'u içerir.
user12205

9

Python 3.3'te:

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

Python 2.7'de kod nesneleri biraz farklıdır:

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

Evet, eski çöpleri bayt kodu yorumlayıcısına iletebilirsiniz ve yürütür ( Python sayı # 17187 ).


Kısa (Python 2.x):exec type((lambda:0).func_code)(0,1,0,0,'Q',(),(),(),'','',0,'')
nneonneo

Teşekkürler! Ve Python 3'te kullanabiliriz .__code__.

6

Özyinelemeli yineleyiciler Python yığınını değil, C yığınını kullanır ( sayı # 14010 ve sayı # 14507 ):

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

Bu, Mac'imdeki Python 2.7.11'i kilitlemez, ancak Python 3.5.1'i kilitler.
nneonneo

4

Tercümanı kilitlemenin kolay bir yolu, onu serbest bırakmaya kandırmak Yoktur:

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

Bonus olarak, Python 2'yi segfault etmenin akıllıca bir yolu:

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

Bunun tam olarak yaptığı şey okuyucuya bir alıştırma olarak bırakılmıştır.


2
Birincisi: Hiçbiri'nin refcount değerini sıfıra ayarlayın ve komik bir şekilde yeniden yerleştirilmesine neden olun. İkincisi: kendinden referanslı bir demet oluşturun ve yazdırın.
nneonneo

3

Birisi FlagsTypeayarlayarak yeni nesnelerin oluşturulmasını engelleyebileceklerini düşündü FlagsType.tp_new = NULL, ancak yöntemi kaldırmayı unuttular ( sayı # 13204 ):

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

( sys.version_infoaynı hataya sahiptir.)


3

Kullanımı allocaiçinde ctypesmodül ( sorun # 13096 ):

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

0

Benim Python ile çökmesini olası bir yolu MemoryError:

x=[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]

2
Bu benim için işe yaramıyor - sadece Python ile a MemoryError. İşletim sistemi tarafından kapatılması gerekiyor.
George

2
Huh. Hata şaşırtıcı derecede sığ bir derinlikte gerçekleşir.
user2357112,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.