Numpy: BUG: PyArray_BufferConverter غير آمن

تم إنشاؤها على ٢٧ يناير ٢٠٢٠  ·  5تعليقات  ·  مصدر: numpy/numpy

هذه الوظيفة:

  1. المكالمات PyObject_GetBuffer
  2. يستخرج مؤشر بيانات
  3. المكالمات PyBuffer_Release
  4. إرجاع المؤشر إلى المتصل

PyBuffer_Release calls PyBufferProcs.bf_releasebuffer(PyObject *exporter, Py_buffer *view) ، والذي وفقًا للمستندات قد _ "يفرغ كل الذاكرة المرتبطة بـ 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 الخاص بهم :()

هذا يضيف بعض الوضوح ، شكرًا - لم أدرك أن بيثون كان يستخدم نفس القراءة مثل bf_releasebuffer كما كنت.

لعنة ، لقد تجاوزت ذلك من قبل (من PEP):

سيحتاج المصدرون إلى تعريف دالة bf_releasebuffer إذا كان بإمكانهم إعادة تخصيص ذاكرتهم أو خطواتهم أو شكلهم أو مجموعاتهم الفرعية أو متغيرات التنسيق التي قد يشاركونها من خلال معلومات البنية العازلة.

التي تقرأ كما لو كانت صالحة لإعطاء المخزن المؤقت جزءًا جديدًا من الذاكرة :(.

على الرغم من أنه: بالنظر إلى تنفيذ array (python one) ، كل ما يفعله هو استخدامه للتأكد من أنه يعطل تغيير الحجم في حالة وجود مخزن مؤقت له.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات