ความล้มเหลว (เช่นทำให้ล่ามหยุดทำงานและบังคับปิด) Python [ปิด]


16

ฉันต้องการดูว่าใครสามารถทำให้ Python มีข้อผิดพลาดร้ายแรงพร้อมรหัสที่สร้างสรรค์ที่สุด ซึ่งหมายความว่าเมื่อโปรแกรมทำงาน Windows จะเข้ามาแทนที่และปรากฏขึ้นพร้อมกับบางสิ่งเช่น“ IDLE หยุดทำงานแล้ว” หรือ Linux จะทำสิ่งใดก็ตามที่ Linux ทำเมื่อโปรแกรมขัดข้อง

กฎ:

  1. สิ่งนี้จะต้องทำใน Python 2.7 หรือสูงกว่า (ดังนั้นข้อผิดพลาดเก่า ๆ จะไม่ถูกหาประโยชน์ที่ได้รับการแก้ไขใน Python เวอร์ชั่นอนาคต)

  2. คำจำกัดความของ "crash" คือ "ทำให้ IDLE หรือ Python exit ในแบบที่ไม่ได้ตั้งใจ" นี่ไม่ได้หมายความว่า "ทำให้ IDLE หรือ Python หยุดและให้การสืบค้นกลับ" นอกจากนี้ยังหมายถึงทางออก sys.quit การยกเลิกและอื่น ๆ ไม่ใช่คำตอบที่ถูกต้อง ตัวอย่างเช่นสิ่งนี้จะไม่ได้รับการยอมรับ:

    import sys
    try:
         print c # Crashes Here, as c is not defined.
     except NameError, SyntaxError:
         print "Oh No!"
         sys.exit()
    
  3. การทำให้ Python หยุดตอบสนองไม่เป็นที่ยอมรับ

  4. รหัสจะต้องอธิบายในสิ่งที่มันจะผิดพลาด ลิงก์ไปยังรายงานข้อผิดพลาดเป็นเรื่องปกติ

คำตอบที่ถูกโหวตมากที่สุดหลังจากชนะ 10 วัน! เริ่ม!!

แก้ไข: ฉันขอให้ชัดเจนว่าวัตถุประสงค์ไม่ใช่เพื่อให้ Python หยุดการใช้งานโปรแกรมด้วยการย้อนกลับ วัตถุประสงค์คือการทำให้ Python หยุดทำงานอย่างสมบูรณ์หรือหยุดทำงาน ซึ่งหมายความว่าหากงานนี้สำเร็จลุล่วง Windows จะให้สิ่งนี้ (ฉันไม่ขัดข้องกับ Word ที่นี่นี่เป็นเพียงตัวอย่างของสิ่งที่ควรเกิดขึ้นสำหรับโปรแกรมอื่น):

บทสนทนาข้อผิดพลาด

หรือสิ่งนี้:

บทสนทนาข้อผิดพลาด 2


1
แท็กโค้ด - ท้าทายต้องมีเกณฑ์การชนะอย่างมีวัตถุประสงค์ ผมคิดสร้างสรรค์มากที่สุดไม่ได้มีวัตถุประสงค์พอ ...
ฮาวเวิร์ด

ตกลง - เปลี่ยนให้สั้นที่สุดเท่าที่จะทำได้เช่นเดียวกับความท้าทายอื่น ๆ .. ความคิดสร้างสรรค์ค่อนข้างคลุมเครือจริง ๆ ...
George

@GeorgeH หากความคิดสร้างสรรค์เป็นสิ่งที่คุณกำลังมองหาการประกวดความนิยมทำงานได้อย่างสมบูรณ์แบบ ส่วนตัวแล้วฉันรู้สึกว่านี่จะเป็นการประกวดที่ได้รับความนิยมมากที่สุด ในอนาคตคุณสามารถเรียกใช้คำถามของคุณผ่านทางแซนด์บ็อกซ์ที่สามารถแก้ปัญหาข้อบกพร่องเหล่านี้ได้ก่อนโพสต์
Justin

2
@ คนที่มี High Rep ฉันprntมีคำถามโดยเจตนา
จอร์จ

6
ฉันลงคะแนนให้ปิดคำถามนี้เป็นนอกหัวข้อเนื่องจากคำถามนี้ขอรหัสที่เป็นอันตราย
AdmBorkBork

คำตอบ:


18

น่าจะเป็นการแข่งขันรหัส -); - ฉันคิดว่าความคิดสร้างสรรค์เป็นสิ่งที่รหัสทำให้: "ฉันแค่ไม่รู้ว่าเกิดอะไรขึ้นที่นี่ ... "

คัดลอกและวางอักขระต่อไปนี้ใน IDLE ที่ทำงานบน Windows:

𐒢

ความผิดพลาดเกี่ยวข้องกับอักขระที่เข้ารหัสเป็น UTF-16 โดย Windows และการแปลงไม่สำเร็จเป็นอักขระ UTF-8 โดย IDLE ...

แก้ไข: python bug # 13153


ฉันไม่แน่ใจว่านี่เป็นคำตอบที่ถูกต้องหรือไม่ คำถามที่ว่า "เมื่อโปรแกรมทำงาน" แต่ที่นี่โปรแกรมไม่ทำงานจริงๆ IDLE แฮงค์เมื่อคุณเพียงวาง𐒢ก่อนที่คุณจะสามารถเรียกใช้ได้
Sebastian Negraszus

ใช่ฉันต้องเห็นด้วยกับ @Sebastian ในโปรแกรม Python คุณเริ่มต้นด้วยไฟล์ข้อความและรัน Python interpreter แต่ไม่สำคัญว่าคุณจะสร้างไฟล์ข้อความอย่างไร
David Z

1
อืม ... puu.sh/7eVar.png
Oberon

มันทำงานบน Mac ได้เช่นกัน!
TheDoctor

19

ctypes ละเมิด:

import ctypes;ctypes.string_at(1)

สิ่งนี้จะส่ง 1 ไปยังที่อยู่และยกเลิกการลงทะเบียน ในระบบที่มีสติ (เช่นที่ 0x00000001 ไม่ใช่ที่อยู่ที่ถูกแมป) ระบบจะแยก segfault ทันที


บนเครื่องของฉันดูเหมือนจะไม่เกิดความผิดพลาดกับล่าม การสืบค้นกลับพร้อมข้อผิดพลาด WindowsError จะปรากฏขึ้น
ธารา

@ ธารา: อานั่นจะเป็นตัวจัดการข้อยกเว้นที่มีโครงสร้างของ ctypes ที่ตรวจจับความผิดพลาด ฉันมั่นใจว่าคุณสามารถชน Python ctypesใน Windows ได้ด้วยวิธีอื่น แต่อาจจะมีตัวอักษรไม่กี่ตัว
nneonneo

12

60

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

ไม่ใช่ความคิดของฉันเอง คัดลอกมาจากวิกิพีเดียงูหลามที่นี่

สิ่งนี้ทำให้เกิดการสอบถามซ้ำแบบไม่สิ้นสุดและไม่ได้หยุดโดยล่ามเพราะเราเปลี่ยนการ จำกัด การสอบถามซ้ำ


ขอบคุณ - นี่เป็นคำตอบที่ดี แต่สำหรับคำถามที่ผิด! วัตถุประสงค์ยังไม่ชัดเจนในคำถาม ขอบคุณสำหรับคำตอบของคุณ
จอร์จ

2
@George H ขออภัยฉันไม่ได้ใช้เครื่อง Windows ในขณะนี้ แต่ข้อผิดพลาดในการแบ่งเซ็กเมนต์ที่ทำให้ตัวแปลภาษาไพ ธ อนไม่สามารถถ่ายโอนข้อมูลได้เพียงพอหรือไม่ i.imgur.com/5gSGBpr.png
user12205

10

signal การละเมิด (ไม่ใช่ Windows เท่านั้น):

import os;os.kill(0,4)

ในระบบส่วนใหญ่ (ซึ่ง SIGILL = 4) สิ่งนี้จะฆ่า Python ด้วยข้อผิดพลาด "คำสั่งที่ผิดกฎหมาย"

หรือคุณสามารถฆ่าโปรแกรมโดยใช้นาฬิกาปลุกนักฆ่า :

import signal;signal.alarm(1)

หลังจากนั้นหนึ่งวินาทีงูหลามก็ตายด้วยข้อความลับ "นาฬิกาปลุก"


รหัสสัญญาณอักขระเดี่ยวอื่น ๆ ที่ใช้งานได้ ได้แก่ 1, 3, 5, 6, 8 และ 9
user12205

9

ใน Python 3.3:

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

ในวัตถุโค้ด Python 2.7 แตกต่างกันเล็กน้อย:

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

ใช่คุณสามารถส่งขยะเก่า ๆ ไปยังล่ามรหัสไบต์และดำเนินการได้ ( Python issue # 17187 )


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

ขอบคุณ! และในหลาม 3 .__code__เราสามารถใช้

6

ตัววนซ้ำซ้ำใช้สแต็ก C ไม่ใช่สแต็ก Python ( ปัญหา # 14010และปัญหา # 14507 ):

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

สิ่งนี้ไม่ทำให้ Python 2.7.11 ผิดพลาดบน Mac ของฉัน แต่มันจะพัง Python 3.5.1
nneonneo

4

วิธีง่าย ๆ ในการทำให้ล่ามเกิดความผิดพลาดคือการลวงให้ไม่มีการจัดสรรคืน:

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

เป็นโบนัสนี่เป็นวิธีที่ฉลาดในการแบ่ง 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

สิ่งนี้ไม่เหลือเป็นแบบฝึกหัดให้ผู้อ่าน


2
ข้อแรก: ตั้งค่า refcount เป็น None เป็นศูนย์ทำให้ได้รับการจัดสรรคืนอย่างสนุกสนาน ประการที่สอง: สร้างและพิมพ์ tuple อ้างอิงตนเอง
nneonneo

3

มีคนคิดว่าพวกเขาสามารถป้องกันไม่ให้FlagsTypeวัตถุใหม่ถูกสร้างขึ้นโดยการตั้งค่าFlagsType.tp_new = NULLแต่พวกเขาลืมที่จะลบวิธีการ ( ปัญหา # 13204 ):

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

( sys.version_infoมีข้อผิดพลาดเดียวกัน)


3

การใช้allocaในctypesโมดูล ( ปัญหา # 13096 ):

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

0

วิธีหนึ่งที่เป็นไปได้ซึ่งทำให้ Python ของฉันล้มเหลวด้วยMemoryError:

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

2
งานนี้ไม่ได้สำหรับฉัน - MemoryErrorมันก็ทำให้งูหลามหยุดด้วย จะต้องมีการปิดโดยระบบปฏิบัติการ
จอร์จ

2
ฮะ. ข้อผิดพลาดเกิดขึ้นที่ระดับตื้นลึกอย่างน่าประหลาดใจ
user2357112 รองรับ Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.