如何导致 Python 3.5 崩溃?
Posted
技术标签:
【中文标题】如何导致 Python 3.5 崩溃?【英文标题】:How can I cause Python 3.5 to crash? 【发布时间】:2017-07-21 12:48:12 【问题描述】:我们在我们的应用程序中使用嵌入式 cpython 作为脚本语言。我们在启动时修改 sys.path 以确保我们不会从应用程序外部执行代码,但是在他们的 PYTHONPATH 中有 sitecustomize.py 的用户导致代码在我们有机会修复 sys.path 之前执行,并且我们认为他们的代码发生了严重崩溃(不是异常,site.py 会优雅地捕获和处理)。
我相信正确的解决方法是在我们初始化 python 之前简单地从环境中清除 PYTHONPATH 变量,但我无法正确测试它,因为我无法重现问题。
我找到的最简单的方法是使用 ctypes 写入内存,例如:
import ctypes
p = (ctypes.c_char).from_address(0)
while True:
p[0] = 0
p = p + 1
但在 Python 3.5 中,它不允许我写入 c_char 类型,并给出错误 "TypeError: 'c_char' object does not support item assignment"。
我尝试了https://wiki.python.org/moin/CrashingPython 提供的一些方法,但均无济于事。
有没有可靠的方法让 Python 3.5 从纯 Python 代码中崩溃?
【问题讨论】:
您应该创建一个 指针 指向c_char
并为其编制索引。
你试过svn.python.org/view/python/trunk/Lib/test/crashers上的所有例子了吗?我无法访问 3.5,但在 repl.it 上运行时确实出现了一些崩溃,即:nasty_eq_vs_dict.py、mutation_inside_cyclegc.py、gc_inspection.py
谢谢,@user2357112,我以前没有使用过 ctypes,只是复制和粘贴代码,但现在我更仔细地研究它,这对我来说显然很有意义。
【参考方案1】:
下面是一个简单的崩溃python的方法:
def crash():
try:
crash()
except:
crash()
crash()
【讨论】:
【参考方案2】:通过ctypes
有很多方法。例如,您的代码的更正版本:
p = ctypes.pointer(ctypes.c_char.from_address(5))
p[0] = b'x'
如果您不想使用 ctypes,您可以在 dict.__repr__
实现中触发 C 堆栈溢出:
x =
for i in range(1000000):
x = 1: x
repr(x)
这可能会在未来的 Python 版本中得到修补,但就目前而言,它应该会导致严重崩溃。
还有一些方法可以通过构建您自己的字节码对象来实现,因为 Python 几乎不做任何事情来确保它正在执行的字节码是有意义的。
【讨论】:
【参考方案3】:只需将 0 / 0 放在要触发崩溃的代码行上。你会得到一个 ZeroDivisionError
我认为这是强制崩溃的最简单方法
【讨论】:
【参考方案4】:找到这个单行:
exec(type((lambda:0).__code__)(0,1,0,0,0,b'',(),(),(),'','',1,b''))
这是从这个code-golf问题中获得的:
Crash (i.e. cause the interpreter to stop working and force close) Python【讨论】:
这看起来不错,虽然我没有测试它。 user2357112 的回答对我有用,而且代码更容易理解。谢谢你的回答。【参考方案5】:你可以使用休闲:
exec(type((lambda: 0).__code__)(0, 0, 0, 0, 0, 0, b'\x053', (), (), (), '', '', 0, b''))
这将创建一个字节码来启动一个永不结束的finally
语句,从而使解释器崩溃。
【讨论】:
【参考方案6】:我通常只使用 Python 2.7,但我相信只要我正确理解您的问题,这里仍然适用。如果您想强制退出 Python 程序,那么我知道的最简单的方法是引发 SystemExit。这是一个相当简单的例子:
for i in range (0, 10):
if (i == 6): #Stop the program at 6 just.. because
raise SystemExit
print(i)
【讨论】:
这不会导致 python 崩溃。这与简单地调用sys.exit()
没有什么不同。以上是关于如何导致 Python 3.5 崩溃?的主要内容,如果未能解决你的问题,请参考以下文章
Python如何修复由于睡眠功能而导致的Tkinter窗口崩溃