Fungsi ini:
PyObject_GetBuffer
PyBuffer_Release
PyBuffer_Release
menelepon PyBufferProcs.bf_releasebuffer(PyObject *exporter, Py_buffer *view)
, yang menurut dokumen mungkin _ "membebaskan semua memori yang terkait dengan view
" _, dan tidak memberikan persyaratan bahwa view
tetap hidup sebagai selama exporter
.
Jadi pada prinsipnya tipe yang mengalokasikan buffer untuk dirinya sendiri dengan cepat di bf_getbuffer
dan menghapusnya ketika rilis penggunaan terakhir itu akan menyebabkan use-after-free di numpy.
Saya tidak tahu apakah ada pelaksana protokol buffer yang benar-benar melakukan ini, tetapi saya membaca bahwa mereka diizinkan.
Ini aneh. Saya pikir saya ingin jika antarmuka buffer menentukan bahwa sementara bidang buffer struct (seperti langkah, dll.) Dibebaskan oleh PyBuffer_Release
memori sebenarnya yang ditunjuk harus dimiliki oleh objek asli (ini akan selesaikan masalah kita dengan _dealloc_cached_buffer_info
sangat mengganggu. Saya pikir ini adalah niat dan benar, tapi ...
Sekarang fungsi ini mengembalikan PyArray_Chunk
dan bukan buffer, jadi jika Anda membuat klarifikasi yang saya katakan di atas, sebenarnya tidak masalah.
Interpretasi Anda terdengar lebih masuk akal - mungkin permintaan pull terhadap python / cpython akan bijaksana, untuk memperbarui dokumen untuk memberi tahu orang-orang agar tidak menerapkan apa yang saya jelaskan di atas.
Tadinya akan terbuka, tapi kemudian pergi makan siang dulu: https://bugs.python.org/issue39471 Saya mungkin akan mengusulkan perubahan yang sebenarnya pada teks. Jika kita dapat menyetujui interpretasi saya, kita dapat membersihkan kode yang sangat jelek dan sangat lambat dalam implementasi protokol buffer (saat ini memperlambat matematika skalar sebesar 20 +%). (EDIT: Tapi saya kira hanya setelah Python memperbaiki kode ArgParse mereka :()
Itu menambah kejelasan, terima kasih - Saya tidak menyadari bahwa python menggunakan pembacaan yang sama dengan bf_releasebuffer
seperti saya.
Sial, saya telah membacanya sebelumnya (dari PEP):
Eksportir perlu mendefinisikan fungsi bf_releasebuffer jika mereka dapat mengalokasikan ulang memori, langkah, bentuk, suboffset, atau variabel format yang mungkin mereka bagikan melalui struct bufferinfo.
Yang dibaca seperti itu valid untuk memberi buffer potongan memori baru :(.
Meskipun: melihat implementasi array
(python one), yang dilakukannya hanyalah menggunakannya untuk memastikan bahwa ia menonaktifkan pengubahan ukuran jika ada buffer.