【问题标题】:How can I cause Python 3.5 to crash?如何导致 Python 3.5 崩溃?
【发布时间】: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 代码中崩溃?

【问题讨论】:

标签: python crash python-3.5


【解决方案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问题中获得的:

        【讨论】:

        • 这看起来不错,虽然我没有测试它。 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()没有什么不同。
          猜你喜欢
          • 2021-08-04
          • 1970-01-01
          • 1970-01-01
          • 2014-10-29
          • 1970-01-01
          • 2018-01-23
          • 2020-12-02
          • 2013-11-11
          • 2011-01-24
          相关资源
          最近更新 更多