崩溃(即导致解释器停止工作并强制关闭)Python [关闭]


16

我想看看谁能使Python最具创意的代码崩溃。这意味着在程序运行时,例如Windows将接管并弹出“ IDLE已停止工作”之类的消息,或者Linux将在程序崩溃时执行Linux所做的任何事情。

规则:

  1. 这必须在python 2.7或更高版本中进行(因此,不会利用旧的bug(在将来的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
标签代码挑战需要客观的获胜标准。我认为大多数创意都不够客观……
霍华德

好了-它病态变化尽可能短,像大多数其他的挑战..创意是相当暧昧其实...
乔治

@GeorgeH如果您正在寻找创意,那么流行度竞赛非常适合。我个人认为这将是一次人气竞赛。将来,您可以在沙盒中提问,在发布之前可以解决这些问题。
贾斯汀

2
@High Rep的人,我prnt的问题是故意的。
乔治

6
我投票关闭此问题为离题,因为该问题要求提供恶意代码。
AdmBorkBork

Answers:


18

应该是一场代码竞赛;)-我想创造力就是代码所做出的陈述:“我只是不知道这里发生了什么……”

在Windows上运行的IDLE中复制并粘贴以下字符:

𐒢

崩溃与Windows将字符编码为UTF-16以及IDLE无法成功转换为UTF-8字符有关...

编辑:python bug#13153


我不确定这是否是正确的答案。问题是“程序何时运行”。但是在这里程序永远不会真正运行。当您仅粘贴时,IDLE就会崩溃𐒢,甚至无法运行它。
塞巴斯蒂安·内格拉苏斯

是的,我必须同意@Sebastian。在Python程序中,您从文本文件开始并在其上运行Python解释器,但是如何创建文本文件并不重要。
David Z


它也适用于Mac!
TheDoctor 2014年

19

ctypes 滥用:

import ctypes;ctypes.string_at(1)

这将1强制转换为地址并取消引用。在任何理智的系统上(即0x00000001都不是映射地址的系统),这将立即发生段错误。


在我的机器上,这似乎没有使解释器崩溃。显示带有WindowsError错误的回溯。
达拉

@Dhara:啊,那将是ctypes的结构化异常处理程序来捕获崩溃。我敢肯定,您可以通过ctypes其他方式使Windows中的Python崩溃,但可能不会出现那么少的字符。
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
2014年

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 2014年

谢谢!在Python 3中,我们可以使用.__code__

6

递归迭代器使用C堆栈,而不是Python的堆栈(问题#14010问题#14507):

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

这不会在我的Mac上使Python 2.7.11崩溃,但会使Python 3.5.1崩溃。
nneonneo

4

使解释器崩溃的一种简单方法是诱使它取消分配None:

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设置为零,使它被滑稽地释放。第二个:构造并打印一个自引用元组。
nneonneo

3

有人认为可以FlagsType通过设置阻止创建新对象FlagsType.tp_new = NULL,但是他们忘记删除该方法(问题#13204):

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

sys.version_info具有相同的错误。)


3

allocactypes模块中使用(问题#13096):

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

0

一种使我的Python崩溃的可能方法是MemoryError

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

2
这对我不起作用-只是使Python停顿了MemoryError。它需要由操作系统关闭。
乔治,

2
嗯 该错误发生在令人惊讶的浅深度。
user2357112支持Monica 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.