如何导致 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窗口崩溃

如何防止错误输入导致应用程序崩溃。 Python、HTML 和 CSS

dll在使用memset时导致Python崩溃

TensorFlow-GPU 导致 python 崩溃

Python turtle 模块导致 OS X 崩溃

由于未知错误导致页面崩溃,Python Selenium 会话被删除:无法从选项卡崩溃中确定加载状态