Numpy: ОШИБКА: PyArray_BufferConverter небезопасен

Созданный на 27 янв. 2020  ·  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 Комментарий

Это странно. Я думаю , что я хотел бы, если интерфейс буфера указан , что в то время как буфер поле структуры (например, махи и т.д.) получает free'd по PyBuffer_Release фактической памяти указало должно принадлежать исходному объекту (это будет решим нашу проблему с очень надоедливым _dealloc_cached_buffer_info ). Думаю, это намерение и правда, но ...

Теперь эта функция возвращает PyArray_Chunk а не буфер, поэтому, если вы сделаете пояснение, о котором я сказал выше, на самом деле все в порядке.

Ваша интерпретация звучит более разумно - возможно, было бы разумно выполнить запрос на перенос против python / cpython, чтобы обновить документы, чтобы люди не реализовывали то, что я описал выше.

Собирался открыть, но потом пошел сначала на обед: https://bugs.python.org/issue39471 Я могу рассмотреть возможность внесения фактических изменений в текст. Если мы сможем согласиться с моей интерпретацией, мы сможем очистить очень уродливый и очень медленный код в реализации буферного протокола (в настоящее время это замедляет скалярную математику на 20 +%). (РЕДАКТИРОВАТЬ: но я полагаю, только после того, как Python исправит их код ArgParse :()

Это добавляет ясности, спасибо - я не понял, что python использует то же чтение, что и bf_releasebuffer как и я.

Блин, я это раньше перечитал (из PEP):

Экспортерам нужно будет определить функцию bf_releasebuffer, если они могут перераспределить свою память, шаги, форму, подсмещения или переменные формата, которые они могут совместно использовать через struct bufferinfo.

Это выглядит так, как будто это допустимый для буфера новый кусок памяти :(.

Хотя: глядя на реализацию array (python one), все, что он делает, это использует его, чтобы гарантировать, что он отключает изменение размера, если для него существует буфер.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги