PyObject_Call 使用绑定方法调用时出现段错误

PyObject_Call segfaults when invoked with bound method

PyObject_Call 在使用绑定方法的实例调用时会出现段错误,但在使用常规(未绑定)过程或使用实现 [=14 的 class 的实例调用时工作正常=],或 type.

的子 classes

为什么它应该这样工作,或者这是一个错误?该行为在 v 3.5 和 3.6 之间是一致的。没有尝试早期版本。

PS。在这种情况下产生的堆栈跟踪甚至不包含我的代码。但是,如果重要的话,崩溃发生在内部

method_dealloc () at Objects/classobject.c:194

看起来像这样:https://github.com/python/cpython/blob/master/Objects/classobject.c#L194

为了防止直接问题:是的,我在调用此过程之前调用了 Py_INCREF(callable)


更多信息

当我试图查看发送到此调用中的内容时,我看到类似这样的内容:

found method: <bound method DefParser.parse of <bound method DefParser.update_definition of <NULL>>>

DefParser.parseDefParser.update_definition 不是完全随机的,但也不完全相关:它们是最近调用的方法。 IE。我怀疑 PyObject_Call 本身没有问题,它只是表示方法对象的方式...出于某种原因,我似乎失去了参考,而是坚持垃圾...

大量调查发现了实际错误。它最终与 PyObject_Call 无关,但它可能会帮助其他可能 运行 遇到这种情况的人。

PyObject_Call 是分配内存的 Python C API 之一。 Python 的内存分配器将机会性地调用 GC。我不确定它何时决定这样做的具体细节,但最终它会发生。然后 GC 将尝试释放由 Python 个对象分配的内存。

在我的情况下发生了什么:有一个使用常规 malloc 分配的字符串,我错误地计算了终止空字节的位置(在某些情况下,它会出现在我请求的内存之后的一个位置)分配)。然后使用此内存创建一个 Python bytes 对象。后来一个,当 GC 将取消分配此对象时,它会出现 seagfault。