Numpy: バグ:PyArray_BufferConverterは安全ではありません

作成日 2020年01月27日  ·  5コメント  ·  ソース: numpy/numpy

この関数:

  1. PyObject_GetBuffer呼び出します
  2. データポインタを抽出します
  3. PyBuffer_Release呼び出します
  4. 発信者へのポインタを返します

PyBuffer_ReleasePyBufferProcs.bf_releasebuffer(PyObject *exporter, Py_buffer *view) PyBuffer_Release呼び出します。これは、ドキュメントによると_ " view関連付けられたすべてのメモリを解放する" _であり、 viewが次のように存続する必要はありません。 exporter限り。

したがって、原則として、 bf_getbufferでその場でバッファを割り当て、最後にリリースを使用したときにそれを削除するタイプは、numpyで解放後の使用を引き起こします。

バッファプロトコルの実装者が実際にこれを行っているかどうかはわかりませんが、私が読んだところによると、許可されているということです。

00 - Bug

全てのコメント5件

変ですね。 バッファ構造体フィールド(ストライドなど)がPyBuffer_Releaseによって解放される一方で、ポイントされた実際のメモリは元のオブジェクトによって所有されている必要があることをバッファインターフェイスで指定したいのですが(これは非常に迷惑な_dealloc_cached_buffer_info問題を解決します)。 これが意図で真実だと思いますが...

これで、この関数はバッファではなくPyArray_Chunkを返すので、上記で説明したことを明確にすると、実際にはまったく問題ありません。

あなたの解釈はより合理的に聞こえます-おそらくpython / cpythonに対するプルリクエストは、私が上で説明したことを実装しないように人々に伝えるためにドキュメントを更新するのが賢明でしょう。

開く予定でしたが、最初に昼食に行きました: https ://bugs.python.org/issue39471実際にテキストの変更を提案することを検討するかもしれません。 私の解釈に同意できれば、バッファプロトコルの実装で非常醜くて非常に遅いコードをクリーンアップできます(現在、スカラー計算が20%以上遅くなります)。 (編集:しかし、PythonがArgParseコードを修正した後でないと思いません:()

これにより、明確さが増します。ありがとうございます。Pythonがbf_releasebufferと同じ読み取り値を使用していることに気づいていませんでした。

くそー、私は以前にそれを読み過ぎていました(PEPから):

エクスポーターは、struct bufferinfoを介して共有する可能性のあるメモリ、ストライド、シェイプ、サブオフセット、またはフォーマット変数を再割り当てできる場合、bf_releasebuffer関数を定義する必要があります。

これは、バッファに新しいメモリチャンクを与えることが有効であるように読み取られます:(。

ただし、 array (python one)の実装を見ると、それを使用して、バッファーが存在する場合サイズ変更が

このページは役に立ちましたか?
0 / 5 - 0 評価