Збій (тобто змушує інтерпретатора перестати працювати і змусити закрити) Python [закрито]


16

Я хотів би побачити, хто може змусити Python до фатальної аварії з найкреативнішим кодом. Це означає, що коли програма запускається, наприклад, Windows, перейме на екран і з’явиться щось на кшталт "IDLE перестала працювати", або Linux зробить все, що робить Linux, коли програма виходить з ладу.

Правила:

  1. Це потрібно зробити в Python 2.7 або вище (тому старі помилки не експлуатуються, які були виправлені у майбутніх версіях Python).

  2. Визначенням "аварії" є "зробити IDLE або Python виїздом ненавмисно". Це не означає "зупинити 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 днів! Почніть !!

EDIT: Чи можу я зрозуміти, що мета не зробити так, щоб Python просто зупинив виконання програми з прослідковуванням. Мета - зробити так, щоб Python повністю вийшов з ладу або припинив роботу. Це означає, що якщо це завдання буде успішно виконано, Windows дасть це (я тут не забиваю Word, це лише приклад того, що має відбутися для іншої програми):

діалог помилок

або це:

діалог помилок 2


1
Виклик коду тегу вимагає об'єктивного критерію виграшу. Я думаю, що більшість креативних недостатньо об'єктивні ...
Говард

Гаразд - я міняю його якомога коротше, як і більшість інших викликів .. Креатив насправді досить неоднозначний ...
Джордж

@GeorgeH Якщо ви шукали креатив, те, що ви шукали, конкурс популярності прекрасно працює. Я особисто вважаю, що це було б найкраще як конкурс на популярність. Надалі ви можете запустити своє запитання через пісочницю, де ці перейми можна відпрацювати перед публікацією.
Джастін

2
@ Люди з високою репутацією, моє prntзапитання навмисне.
Джордж

6
Я голосую, щоб закрити це питання поза темою, оскільки це запитання вимагає шкідливого коду.
AdmBorkBork

Відповіді:


18

Повинні були бути змагання з гольф-коду;) - Я думаю, що творчість - це твердження, яке вказує код: "Я просто не знаю, що тут відбувається ..."

Скопіюйте та вставте наступний символ у IDLE, що працює у Windows:

𐒢

Збій має щось спільне з тим, що персонаж кодується як UTF-16 в Windows, і невдале перетворення символу UTF-8 за допомогою IDLE ...

Редагувати: помилка python # 13153


Я не впевнений, чи справді це правдива відповідь. Питання говорить "коли програма працює". Але тут програма ніколи насправді не запускається. IDLE виходить з ладу, коли ви просто вставляєте 𐒢, перш ніж ви навіть зможете його запустити.
Себастьян Неграш

Так, я маю згоду з @Sebastian. У програмі Python ви починаєте з текстового файлу і запускаєте інтерпретатор Python на ньому, але це не має значення, як ви створюєте текстовий файл.
David Z


Він працює і на Mac!
TheDoctor

19

ctypes зловживання:

import ctypes;ctypes.string_at(1)

Це закидає 1 на адресу та зменшує її. У будь-якій здоровій системі (наприклад, у якій 0x00000001 не є відображеною адресою), це буде миттєво сегментоване.


На моїй машині це, здається, не призведе до збоїв перекладача. Відображається трекбек із помилкою WindowsError.
Дхара

@Dhara: Ах, це був би структурований обробник винятків ctypes, що сприймає аварію. Я впевнений, що ви можете зламати Python з ctypesWindows в інший спосіб, але, можливо, не так вже й мало символів.
nneonneo

12

60

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

Не моя власна ідея. Скопійовано з Python Wiki тут .

Це викликає нескінченну рекурсію, і інтерпретатор не зупиняється, оскільки ми змінили межу рекурсії.


Спасибі - це чудова відповідь, але за неправильне запитання! Ціль у питанні не з'ясована. Дякую за вашу відповідь.
Джордж

2
@George H Вибачте, я зараз не використовую машину Windows, але чи не є помилкою сегментації, через яку інтерпретатор python достатньо скидає ядро? i.imgur.com/5gSGBpr.png
user12205

10

signal зловживання (лише для ОС Windows):

import os;os.kill(0,4)

У більшості систем (на яких SIGILL = 4) це знищить Python з помилкою "незаконної інструкції".

Або ви можете вбити програму за допомогою будильника-вбивці :

import signal;signal.alarm(1)

Через одну секунду Пітон помирає з криптовалютним повідомленням "Будильник".



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 ).


Коротше (Python 2.x):exec type((lambda:0).func_code)(0,1,0,0,'Q',(),(),(),'','',0,'')
nneonneo

Спасибі! І в Python 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
Перший: встановіть коефіцієнт знижки нуля на нуль, змусивши його весело розташуватися. Другий: сконструюйте та надрукуйте кортеж, що сам посилається.
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
Це не працює для мене - це просто змушує Python зупинятися з a MemoryError. Його потрібно закрити ОС.
Джордж

2
Ага. Помилка трапляється на дивно невелику глибину.
user2357112 підтримує Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.