Сбой (то есть переводчик перестает работать и принудительно закрывается) Python [закрыто]


16

Я хотел бы посмотреть, кто может заставить Python привести к фатальному сбою с самым креативным кодом. Это означает, что когда программа запускается, например, Windows, вступает во владение и появляется что-то вроде «IDLE прекратил работать», или Linux будет делать то же, что и Linux, в случае сбоя программы.

Правила:

  1. Это должно быть сделано в Python 2.7 или выше (поэтому старые ошибки не используются, которые были исправлены в будущих версиях Python).

  2. Определение «сбой» - «заставить IDLE или Python выйти непреднамеренно». Это не означает «остановка IDLE или Python и обратная связь». Это также означает, что exit, sys.quit, abort и т. Д. Не являются правильными ответами. Например, это не будет принято:

    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
Для тега code-challenge требуется объективный критерий выигрыша. Я думаю, что большинство креативов недостаточно объективны ...
Говард

Хорошо, я изменю его на как можно более короткий, как и большинство других проблем. На самом деле Creative довольно неоднозначен ...
Джордж,

@GeorgeH Если креатив - это то, что вы искали, конкурс популярности работает отлично. Я лично чувствую, что это было бы лучше всего как соревнование популярности. В будущем вы можете задать свой вопрос через « песочницу», где эти изломки могут быть решены до публикации.
Джастин

2
@ Люди с High Rep, мой prntв вопросе намеренно.
Джордж

6
Я голосую, чтобы закрыть этот вопрос как не по теме, потому что этот вопрос требует вредоносного кода.
AdmBorkBork

Ответы:


18

Должно быть, это был турнир по коду для игры в гольф;) - я думаю, что креативность - это утверждение, которое делает код: «Я просто не знаю, что здесь происходит ...»

Скопируйте и вставьте следующий символ в IDLE, работающем в Windows:

𐒢

Авария как-то связана с тем, что Windows кодирует символ UTF-16, и с неудачным преобразованием символа UTF-8 в IDLE ...

Изменить: ошибка питона # 13153


Я не уверен, действительно ли это правильный ответ. Вопрос говорит "когда программа запускается". Но здесь программа никогда не запускается. IDLE падает, когда вы просто вставляете 𐒢, прежде чем вы даже сможете запустить его.
Себастьян Неграсус

Да, я должен согласиться с @Sebastian. В программе Python вы начинаете с текстового файла и запускаете на нем интерпретатор Python, но это не должно иметь значения при создании текстового файла.
Дэвид З


Это работает на Mac тоже!
Доктор

19

ctypes злоупотребление:

import ctypes;ctypes.string_at(1)

Это приводит 1 к адресу и разыменовывает его. В любой здравомыслящей системе (т. Е. Той, в которой 0x00000001 не является сопоставленным адресом), это мгновенно прекратит работу с ошибкой.


На моей машине это не приводит к сбою интерпретатора. Отображается трассировка с ошибкой WindowsError.
Дхара

@Dhara: Ах, это был бы структурированный обработчик исключений ctypes для обнаружения аварии. Я уверен, что вы можете потерпеть крах Python ctypesв Windows каким-либо другим способом, но, возможно, не так мало символов.
nneonneo

12

60

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

Не моя собственная идея. Скопировано из Python Wiki здесь .

Это вызывает бесконечную рекурсию и не останавливается интерпретатором, потому что мы изменили предел рекурсии.


Спасибо - это отличный ответ, но за неправильный вопрос! Цель не была уточнена в этом вопросе. Спасибо за ваш ответ, хотя.
Джордж

2
@ Джордж Х Извините, я сейчас не пользуюсь машиной с 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)

Через одну секунду Python умирает с загадочным сообщением «Будильник».


Другие работающие односимвольные сигнальные коды включают в себя 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 # 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

Один простой способ разбить интерпретатор - обмануть None:

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

В качестве бонуса, вот умный способ 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

Что именно это делает, оставлено читателю в качестве упражнения.


2
Первый: установите refcount из None в ноль, заставляя его быть занятым. Второй: создайте и напечатайте кортеж, ссылающийся на себя.
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 с MemoryError. Это должно быть закрыто ОС.
Джордж

2
Да. Ошибка происходит на удивительно небольшой глубине.
user2357112 поддерживает Monica
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.