Sự cố (nghĩa là khiến trình thông dịch ngừng hoạt động và buộc đóng) Python [đã đóng]


16

Tôi muốn xem ai có thể khiến Python gặp sự cố nghiêm trọng với mã sáng tạo nhất. Điều này có nghĩa là khi chương trình chạy, Windows chẳng hạn, sẽ tiếp quản và bật lên với một cái gì đó giống như ID IDLE đã ngừng hoạt động, hoặc Linux sẽ làm bất cứ điều gì Linux làm khi chương trình gặp sự cố.

Quy tắc:

  1. Điều này phải được thực hiện trong Python 2.7 trở lên (Vì vậy, các lỗi cũ không được khai thác đã được sửa trong các phiên bản tương lai của Python).

  2. Định nghĩa của "crash" là "tạo IDLE hoặc Python thoát theo cách không có chủ ý." Điều này không có nghĩa là "làm cho IDLE hoặc Python dừng lại và đưa ra một dấu vết". Điều này cũng có nghĩa là lối ra, sys.quito, hủy bỏ vv không phải là câu trả lời hợp lệ. Ví dụ: điều này sẽ không được chấp nhận:

    import sys
    try:
         print c # Crashes Here, as c is not defined.
     except NameError, SyntaxError:
         print "Oh No!"
         sys.exit()
    
  3. Làm cho Python ngừng trả lời không được chấp nhận.

  4. Mã phải được giải thích về những gì nó làm để sụp đổ. Một liên kết đến một báo cáo lỗi là tốt.

Câu trả lời được đánh giá cao nhất sau 10 ngày chiến thắng! Bắt đầu !!

EDIT: Tôi có thể nói rõ rằng mục tiêu không phảikhiến Python chỉ dừng việc thực hiện chương trình với một dấu vết. Mục tiêu là làm cho Python hoàn toàn sụp đổ hoặc ngừng hoạt động. Điều này có nghĩa là nếu nhiệm vụ này được thực hiện thành công, Windows sẽ đưa ra điều này (Tôi không gặp sự cố Word ở đây, đây chỉ là một ví dụ về những gì sẽ xảy ra cho một chương trình khác):

đối thoại lỗi

hoặc này:

lỗi đối thoại 2


1
Thử thách mã thẻ yêu cầu một tiêu chí chiến thắng khách quan. Tôi nghĩ rằng hầu hết sáng tạo không đủ khách quan ...
Howard

Ok - Tôi sẽ thay đổi nó càng ngắn càng tốt, giống như hầu hết các thử thách khác .. Sáng tạo thực sự khá mơ hồ ...
George

@GeorgeH Nếu sáng tạo là những gì bạn đang tìm kiếm, cuộc thi phổ biến hoạt động hoàn hảo. Cá nhân tôi cảm thấy rằng đây sẽ là một cuộc thi nổi tiếng. Trong tương lai, bạn có thể chạy câu hỏi của mình thông qua hộp cát nơi những kink này có thể được xử lý trước khi đăng.
Justin

2
@ Những người có Đại diện cao, prnttrong câu hỏi của tôi là có chủ ý.
George

6
Tôi đang bỏ phiếu để đóng câu hỏi này ngoài chủ đề vì câu hỏi này yêu cầu mã độc.
admBorkBork

Câu trả lời:


18

Đáng lẽ phải là một cuộc thi đánh gôn;) - Tôi đoán sự sáng tạo là tuyên bố mà bộ luật đưa ra: "Tôi chỉ không biết chuyện gì đang xảy ra ở đây ..."

Sao chép và dán ký tự sau trong IDLE đang chạy trên Windows:

𐒢

Sự cố có liên quan đến nhân vật được mã hóa dưới dạng UTF-16 bởi Windows và việc chuyển đổi không thành thành ký tự UTF-8 bằng IDLE ...

Chỉnh sửa: lỗi python # 13153


Tôi không chắc đây có thực sự là một câu trả lời hợp lệ không. Câu hỏi cho biết "khi chương trình chạy". Nhưng ở đây chương trình không bao giờ thực sự chạy. IDLE gặp sự cố khi bạn chỉ dán 𐒢, trước khi bạn có thể chạy nó.
Sebastian Negraszus

Vâng, tôi phải đồng ý với @Sebastian. Trong chương trình Python, bạn bắt đầu với tệp văn bản và chạy trình thông dịch Python trên đó, nhưng việc bạn tạo tệp văn bản không quan trọng.
David Z

1

Nó cũng hoạt động trên Mac!
TheDoctor

19

ctypes lạm dụng:

import ctypes;ctypes.string_at(1)

Điều này phôi 1 đến một địa chỉ và hủy bỏ nó. Trên bất kỳ hệ thống lành mạnh nào (tức là một hệ thống trong đó 0x00000001 không phải là địa chỉ được ánh xạ), điều này sẽ phân tách ngay lập tức.


Trên máy của tôi, điều này dường như không làm hỏng trình thông dịch. Một dấu vết với lỗi WindowsError được hiển thị.
Dhara

@Dhara: Ah, đó sẽ là trình xử lý ngoại lệ có cấu trúc của ctypes bắt vụ tai nạn. Tôi chắc chắn rằng bạn có thể đánh sập Python với ctypesWindows theo một số cách khác, nhưng có lẽ không có quá ít ký tự.
nneonneo

12

60

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

Không phải ý tưởng của riêng tôi. Sao chép từ Wiki Python ở đây .

Điều này gây ra một đệ quy vô hạn và không bị người phiên dịch dừng lại vì chúng tôi đã thay đổi giới hạn đệ quy.


Cảm ơn - đây là một câu trả lời tuyệt vời, nhưng cho câu hỏi sai! Mục tiêu chưa được làm rõ trong câu hỏi. Cảm ơn câu trả lời của bạn mặc dù.
George

2
@George H Xin lỗi, hiện tại tôi không sử dụng máy Windows, nhưng không phải là lỗi phân đoạn khiến trình thông dịch python đổ lõi đủ? i.imgur.com/5gSGBpr.png
dùng12205

10

signal lạm dụng (chỉ dành cho Windows):

import os;os.kill(0,4)

Trên hầu hết các hệ thống (trên đó SIGILL = 4), điều này sẽ giết Python với lỗi "hướng dẫn bất hợp pháp".

Hoặc bạn có thể giết chương trình bằng đồng hồ báo thức sát thủ :

import signal;signal.alarm(1)

Sau một giây, Python chết với thông điệp khó hiểu "Đồng hồ báo thức".


Các mã tín hiệu ký tự đơn khác hoạt động bao gồm 1, 3, 5, 6, 8 và 9.
user12205

9

Trong Python 3.3:

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

Trong Python 2.7, các đối tượng mã hơi khác nhau:

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

Có, bạn có thể chuyển bất kỳ rác cũ nào cho trình thông dịch mã byte và nó thực thi nó ( vấn đề Python # 17187 ).


Ngắn hơn (Python 2.x):exec type((lambda:0).func_code)(0,1,0,0,'Q',(),(),(),'','',0,'')
nneonneo

Cảm ơn! Và trong Python 3 chúng ta có thể sử dụng .__code__.

6

Các trình vòng lặp đệ quy sử dụng ngăn xếp C, không phải ngăn xếp Python ( vấn đề # 14010vấn đề # 14507 ):

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

Điều này không làm sập Python 2.7.11 trên máy Mac của tôi, nhưng nó bị sập Python 3.5.1.
nneonneo

4

Một cách dễ dàng để đánh sập trình thông dịch là lừa nó để giải quyết Không:

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

Như một phần thưởng, đây là một cách thông minh để segfault 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

Chính xác những gì nó làm là một bài tập cho người đọc.


2
Đầu tiên: thiết lập tổng số không thành 0, làm cho nó được giải quyết một cách vui nhộn. Thứ hai: xây dựng và in một tuple tự tham chiếu.
nneonneo

3

Ai đó nghĩ rằng họ có thể ngăn các FlagsTypeđối tượng mới được tạo bằng cách cài đặt FlagsType.tp_new = NULL, nhưng họ quên xóa phương thức ( vấn đề # 13204 ):

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

( sys.version_infocó cùng một lỗi.)


3

Sử dụng allocatrong ctypesmô-đun ( vấn đề # 13096 ):

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

0

Một cách có thể làm hỏng Python của tôi với MemoryError:

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

2
Điều này không làm việc cho tôi - nó chỉ khiến Python dừng lại với a MemoryError. Nó cần phải được đóng bởi hệ điều hành.
George

2
Huh. Các lỗi xảy ra ở độ sâu nông đáng ngạc nhiên.
user2357112 hỗ trợ Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.