Numpy: BUG: PyArray_BufferConverter não é seguro

Criado em 27 jan. 2020  ·  5Comentários  ·  Fonte: numpy/numpy

Esta função:

  1. Chama PyObject_GetBuffer
  2. Extrai um ponteiro de dados
  3. Chama PyBuffer_Release
  4. Retorna o ponteiro para o chamador

PyBuffer_Release chama PyBufferProcs.bf_releasebuffer(PyObject *exporter, Py_buffer *view) , que de acordo com os documentos pode _ "liberar toda a memória associada a view " _ e não exige que view permaneça vivo como contanto que exporter .

Portanto, em princípio, um tipo que aloca um buffer para si mesmo em tempo real em bf_getbuffer e o exclui quando o último uso for liberado, ele causará um uso após a liberação em numpy.

Não sei se algum implementador do protocolo de buffer realmente faz isso, mas minha leitura é que eles têm permissão para fazer isso.

00 - Bug

Todos 5 comentários

Isto é estranho. Acho que gostaria que a interface do buffer especificasse que, enquanto os campos de estrutura do buffer (como strides, etc.) são liberados por PyBuffer_Release a memória real apontada deve ser propriedade do objeto original (isso seria resolver o nosso problema com o muito chato _dealloc_cached_buffer_info ). Acho que essa é a intenção e é verdade, mas ...

Agora esta função retorna um PyArray_Chunk e não um buffer, então se você fizer o esclarecimento que eu disse acima, na verdade está tudo bem.

Sua interpretação parece mais razoável - talvez uma solicitação pull contra python / cpython seja sábia, para atualizar a documentação para dizer às pessoas para não implementar o que descrevi acima.

Ia abrir, mas depois fui almoçar primeiro: https://bugs.python.org/issue39471 Posso propor realmente mudanças no texto. Se pudermos concordar com minha interpretação, podemos limpar um código muito feio e muito lento na implementação do protocolo de buffer (atualmente, ele retarda a matemática escalar em 20% +). (EDITAR: Mas suponho que somente depois que o Python corrigir seu código ArgParse :()

Isso adiciona alguma clareza, obrigado - eu não tinha percebido que python estava usando a mesma leitura que bf_releasebuffer que eu.

Droga, eu já havia lido isso antes (do PEP):

Os exportadores precisarão definir uma função bf_releasebuffer se puderem realocar sua memória, passos, forma, suboffsets ou variáveis ​​de formato que possam compartilhar por meio de struct bufferinfo.

O que parece válido para dar ao buffer um novo pedaço de memória :(.

Embora: olhando para a implementação de array (python one), tudo o que ele faz é usá-lo para garantir que desativa o redimensionamento se houver um buffer.

Esta página foi útil?
0 / 5 - 0 avaliações