我怎么能导致Python 3.5崩溃?

时间:2017-03-02 00:04:33

标签: python crash python-3.5

我们在应用中使用嵌入式cpython作为脚本语言。我们在启动时修改我们的sys.path以确保我们不从我们的应用程序外部执行代码,但是在PYTHONPATH中使用sitecustomize.py的用户导致代码在我们有机会修复sys之前执行.path,我们相信他们的代码有一个严重的崩溃(不是例外,site.py将优雅地捕获和处理)。

我认为正确的解决方法是在初始化python之前简单地从环境中清除PYTHONPATH变量,但我无法正确测试它,因为我无法重新创建问题。

我发现最简单的方法是使用ctypes写入内存,例如:

public ActionResult GroupRights(PermissionsVM model)

但是在Python 3.5中,它不允许我写入c_char类型,给出错误" TypeError:' c_char'对象不支持项目分配"

我已尝试https://wiki.python.org/moin/CrashingPython中提供的一些方法无济于事。

有没有一种可靠的方法可以从纯Python代码中崩溃python 3.5?

6 个答案:

答案 0 :(得分: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几乎不会确保它执行的字节码有意义。

答案 1 :(得分:2)

只需在要触发崩溃的代码行上添加0/0。您将收到一个ZeroDivisionError

我认为这是强制崩溃的最简单方法

答案 2 :(得分:1)

发现这个单行:

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

从这个code-golf问题中被抓住了:

答案 3 :(得分:0)

我通常只使用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)

我希望这有用!

快乐的编码!

答案 4 :(得分:0)

这是使python崩溃的一种简单方法:

def crash():
    try:
        crash()
    except:
        crash()

crash()

答案 5 :(得分:0)

您可以使用休闲:

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

这将创建字节码,该字节码启动一个finally语句,该语句永不结束,从而使解释程序崩溃。