Numpy: BUG: PyArray_BufferConverter ist unsicher

Erstellt am 27. Jan. 2020  ·  5Kommentare  ·  Quelle: numpy/numpy

Diese Funktion:

  1. Ruft PyObject_GetBuffer
  2. Extrahiert einen Datenzeiger
  3. Ruft PyBuffer_Release
  4. Gibt den Zeiger an den Aufrufer zurück

PyBuffer_Release ruft PyBufferProcs.bf_releasebuffer(PyObject *exporter, Py_buffer *view) , was laut den Dokumenten _ "den gesamten mit view " verbundenen Speicher freigeben kann und keine Anforderung gibt, dass view am Leben bleibt solange exporter .

Im Prinzip führt ein Typ, der sich im Handumdrehen einen Puffer in bf_getbuffer zuweist und ihn löscht, wenn die letzten Verwendungen veröffentlicht werden, zu einer nachträglichen Verwendung in numpy.

Ich weiß nicht, ob Implementierer des Pufferprotokolls dies tatsächlich tun, aber ich lese es so, dass sie es dürfen.

00 - Bug

Alle 5 Kommentare

Das ist merkwürdig. Ich denke, ich würde gerne, wenn die Pufferschnittstelle angibt, dass, während die Pufferstrukturfelder (wie z. B. Schritte usw.) um PyBuffer_Release freigegeben werden, der tatsächliche Speicher, auf den verwiesen wird, dem ursprünglichen Objekt gehören muss (dies würde der Fall sein) Löse unser Problem mit dem sehr nervigen _dealloc_cached_buffer_info ). Ich denke das ist die Absicht und wahr, aber ...

Jetzt gibt diese Funktion ein PyArray_Chunk und keinen Puffer zurück. Wenn Sie also die oben genannte Klarstellung vornehmen, ist dies tatsächlich völlig in Ordnung.

Ihre Interpretation klingt vernünftiger - vielleicht wäre eine Pull-Anfrage gegen Python / Python sinnvoll, um die Dokumente zu aktualisieren und den Leuten zu sagen, dass sie das, was ich oben beschrieben habe, nicht implementieren sollen.

Wollte öffnen, ging dann aber zuerst zum Mittagessen: https://bugs.python.org/issue39471 Ich kann prüfen, ob tatsächlich Änderungen am Text vorgeschlagen werden. Wenn wir uns auf meine Interpretation einigen können, können wir sehr hässlichen und sehr langsamen Code in der Implementierung des Pufferprotokolls bereinigen (dies verlangsamt derzeit die Skalarmathematik um 20 +%). (EDIT: Aber ich nehme an, erst nachdem Python ihren ArgParse-Code repariert hat :()

Das fügt etwas Klarheit hinzu, danke - ich hatte nicht bemerkt, dass Python dieselbe Lesart wie bf_releasebuffer wie ich.

Verdammt, das hatte ich vorher schon gelesen (aus dem PEP):

Exporteure müssen eine Funktion bf_releasebuffer definieren, wenn sie ihren Speicher, ihre Schritte, Formen, Untermengen oder Formatvariablen neu zuweisen können, die sie möglicherweise über die Struktur bufferinfo gemeinsam nutzen.

Was so aussieht, als ob es gültig wäre, dem Puffer einen neuen Speicherblock zu geben :(.

Obwohl: Betrachtet man die Implementierung von array (Python 1), wird es nur verwendet, um sicherzustellen, dass die Größenänderung

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen