Absturz (dh der Interpreter hört auf zu arbeiten und erzwingt das Schließen) Python [closed]


16

Ich würde gerne sehen, wer Python mit dem kreativsten Code zum Absturz bringen kann. Das heißt, wenn das Programm ausgeführt wird, übernimmt zum Beispiel Windows und zeigt so etwas wie "IDLE hat aufgehört zu funktionieren" an, oder Linux macht das, was Linux tut, wenn ein Programm abstürzt.

Regeln:

  1. Dies muss in Python 2.7 oder höher durchgeführt werden (alte Fehler, die in zukünftigen Versionen von Python behoben wurden, werden also nicht ausgenutzt).

  2. Die Definition von "Absturz" lautet "IDLE oder Python unbeabsichtigt beenden". Dies bedeutet nicht "IDLE oder Python anhalten und einen Traceback geben". Dies bedeutet auch, dass exit, sys.quit, abort usw. keine gültigen Antworten sind. Dies wird beispielsweise nicht akzeptiert:

    import sys
    try:
         print c # Crashes Here, as c is not defined.
     except NameError, SyntaxError:
         print "Oh No!"
         sys.exit()
    
  3. Es wird nicht akzeptiert, dass Python nicht mehr reagiert.

  4. Der Code muss erklärt werden, was er zum Absturz bringt. Ein Link zu einem Fehlerbericht ist in Ordnung.

Die am besten bewertete Antwort nach 10 Tagen gewinnt! Start!!

EDIT: Darf ich klarstellen, dass es nicht das Ziel ist , Python dazu zu bringen, die Ausführung des Programms mit einem Traceback anzuhalten. Das Ziel ist es, Python zum Absturz zu bringen oder nicht mehr zu funktionieren. Das heißt, wenn diese Aufgabe erfolgreich ausgeführt wird, gibt Windows Folgendes aus (ich stürze hier nicht mit Word ab, es ist nur ein Beispiel dafür, was für ein anderes Programm passieren sollte):

Fehlerdialog

oder dieses:

Fehlerdialog 2


1
Die Tag- Code-Challenge erfordert ein objektives Gewinnkriterium. Ich denke, die meisten kreativen ist nicht objektiv genug ...
Howard

Ok - Ich ändere es so kurz wie möglich, wie die meisten anderen Herausforderungen. Creative ist eigentlich ziemlich mehrdeutig ...
George

@GeorgeH Wenn kreativ das ist, wonach Sie gesucht haben, funktioniert der Beliebtheitswettbewerb perfekt. Ich persönlich bin der Meinung, dass dies als Beliebtheitswettbewerb am besten wäre. In Zukunft können Sie Ihre Frage in der Sandbox ausführen, wo diese Knicke vor dem Posten herausgearbeitet werden können.
Justin

2
@People mit High Rep, meine prntin der Frage ist absichtlich.
George

6
Ich stimme dafür, diese Frage als "Off-Topic" zu schließen, da in dieser Frage nach bösartigem Code gefragt wird.
AdmBorkBork

Antworten:


18

Sollte ein Code-Golf-Wettbewerb gewesen sein;) - Ich denke, die Kreativität ist die Aussage, die der Code macht: "Ich weiß einfach nicht, was hier passiert ..."

Kopieren Sie das folgende Zeichen in IDLE, das unter Windows ausgeführt wird, und fügen Sie es ein :

𐒢

Der Absturz hat etwas mit dem Zeichen zu tun, das von Windows als UTF-16 codiert wird, und der nicht erfolgreichen Konvertierung in ein UTF-8-Zeichen durch IDLE ...

Bearbeiten: Python-Fehler # 13153


Ich bin mir nicht sicher, ob dies wirklich eine gültige Antwort ist. Die Frage lautet "Wann läuft das Programm?". Aber hier wird das Programm nie wirklich ausgeführt. IDLE stürzt ab, wenn Sie lediglich das einfügen 𐒢, bevor Sie es überhaupt ausführen können.
Sebastian Negraszus

Ja, ich muss @Sebastian zustimmen. In einem Python-Programm beginnen Sie mit einer Textdatei und führen den Python-Interpreter darauf aus, es sollte jedoch keine Rolle spielen, wie Sie die Textdatei erstellen.
David Z


Es funktioniert auch auf dem Mac!
TheDoctor

19

ctypes Missbrauch:

import ctypes;ctypes.string_at(1)

Dadurch wird 1 in eine Adresse umgewandelt und dereferenziert. Auf jedem vernünftigen System (dh einem, auf dem 0x00000001 keine zugeordnete Adresse ist) tritt sofort ein Fehler auf.


Auf meinem Computer scheint dies den Interpreter nicht zum Absturz zu bringen. Ein Traceback mit einem WindowsError-Fehler wird angezeigt.
Dhara

@Dhara: Ah, das wäre der strukturierte Ausnahmehandler von ctypes, der den Absturz abfängt. Ich bin mir sicher, dass Sie Python mit ctypesWindows auf andere Weise zum Absturz bringen können, aber vielleicht nicht mit so wenigen Zeichen.
Nneonneo

12

60

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

Nicht meine eigene Idee. Hier aus dem Python-Wiki kopiert .

Dies verursacht eine unendliche Rekursion und wird vom Interpreter nicht gestoppt, da wir das Rekursionslimit geändert haben.


Danke - das ist eine gute Antwort, aber für die falsche Frage! Das Ziel wurde in der Frage nicht geklärt. Vielen Dank für Ihre Antwort.
George

2
@George H Tut mir leid, dass ich momentan keinen Windows-Computer verwende, aber liegt kein Segmentierungsfehler vor, der dazu führt, dass der Python-Interpreter den Kern genug auslagert? i.imgur.com/5gSGBpr.png
user12205

10

signal Missbrauch (nur Nicht-Windows):

import os;os.kill(0,4)

Auf den meisten Systemen (auf denen SIGILL = 4 ist) wird Python mit einem "illegalen Befehl" -Fehler beendet.

Oder Sie können das Programm mit dem Killerwecker beenden :

import signal;signal.alarm(1)

Nach einer Sekunde stirbt Python mit der kryptischen Meldung "Wecker".


Andere Einzelzeichensignalcodes, die funktionieren, sind 1, 3, 5, 6, 8 und 9.
user12205

9

In Python 3.3:

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

In Python 2.7 unterscheiden sich Codeobjekte geringfügig:

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

Ja, Sie können jeden alten Müll an den Bytecode-Interpreter übergeben und dieser führt ihn aus ( Python-Ausgabe Nr. 17187 ).


Kürzere (Python 2.x):exec type((lambda:0).func_code)(0,1,0,0,'Q',(),(),(),'','',0,'')
Nneonneo

Vielen Dank! Und in Python 3 können wir verwenden .__code__.

6

Rekursive Iteratoren verwenden den C-Stapel, nicht den Python-Stapel ( Problem # 14010 und Problem # 14507 ):

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

Dies bringt Python 2.7.11 auf meinem Mac nicht zum Absturz, aber es bringt Python 3.5.1 zum Absturz.
Nneonneo

4

Eine einfache Möglichkeit, den Interpreter zum Absturz zu bringen, besteht darin, die Zuordnung von None aufzuheben:

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

Als Bonus gibt es eine clevere Möglichkeit, Python 2 zu verwerfen:

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

Was genau dies tut, bleibt dem Leser als Übung überlassen.


2
Erste: Setze refcount von None auf Null, was dazu führt, dass die Zuordnung auf lustige Weise aufgehoben wird. Zweitens: Erstellen und drucken Sie ein selbstreferenzierendes Tupel.
Nneonneo

3

Jemand dachte, sie könnten verhindern, dass neue FlagsTypeObjekte durch Setzen von Einstellungen erstellt werden FlagsType.tp_new = NULL, vergaßen jedoch, die Methode zu entfernen ( Problem # 13204 ):

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

( sys.version_infohat den gleichen Bug.)


3

Verwendung von allocain ctypesModul ( Ausgabe # 13096 ):

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

0

Ein möglicher Weg, mit dem mein Python abstürzt MemoryError:

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

2
Das funktioniert bei mir nicht - es bringt Python nur dazu, mit a anzuhalten MemoryError. Es muss vom Betriebssystem geschlossen werden.
George

2
Huh. Der Fehler tritt in einer überraschend geringen Tiefe auf.
user2357112 unterstützt Monica
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.