Numpy: BUG:PyArray_BufferConverter不安全

创建于 2020-01-27  ·  5评论  ·  资料来源: numpy/numpy

该功能:

  1. 呼叫PyObject_GetBuffer
  2. 提取数据指针
  3. 呼叫PyBuffer_Release
  4. 返回指向调用者的指针

PyBuffer_Release调用PyBufferProcs.bf_releasebuffer(PyObject *exporter, Py_buffer *view) ,根据文档,它们可以_“释放与view相关的所有内存” _,并且不要求view仍然存活只要exporter

因此,原则上,一个类型会在bf_getbuffer中动态为其分配缓冲区,并在最后一个使用版本释放时将其删除,这会在numpy中导致使用后释放。

我不知道是否有缓冲协议的实现者实际这样做,但是我的理解是允许他们这样做。

00 - Bug

所有5条评论

这很奇怪。 我想我想如果缓冲区接口指定当缓冲区结构字段(例如步幅等)由PyBuffer_Release释放时,指向的实际内存必须归原始对象所有(这将用非常烦人的_dealloc_cached_buffer_info解决我们的问题。 我认为这是意图和真实,但是...

现在,此函数返回PyArray_Chunk而不是缓冲区,因此,如果您在上面说的很清楚,它实际上就可以了。

您的解释听起来更合理-对python / cpython的请求可能是明智的,以更新文档以告诉人们不要实现我上面描述的内容。

本来打算开放,但是先去吃午饭: https : 非常丑陋且非常慢的代码(当前,它使标量数学的运行速度降低了20%以上)。 (编辑:但是我想只有在Python修复了他们的ArgParse代码之后:()

这增加了一些清晰度,谢谢-我还没有意识到python使用的读取与bf_releasebuffer相同。

该死的,我之前(从PEP)已经过分理解:

如果导出程序可以重新分配它们可能通过结构bufferinfo共享的内存,步幅,形状,子偏移量或格式变量,则它们需要定义bf_releasebuffer函数。

读起来就像给缓冲区一个新的内存块((。

尽管:查看array (Python一个)的实现,但它所做的只是使用它来确保在存在缓冲区的情况下禁用大小调整。

此页面是否有帮助?
0 / 5 - 0 等级