Numpy: بيانات و segfault غير صالحة عند قراءة تجاوز حجم الملف مع fromfile على Ubuntu 16.04

تم إنشاؤها على ٣١ أكتوبر ٢٠١٨  ·  4تعليقات  ·  مصدر: numpy/numpy


fromfile بيانات غير صالحة وأحيانًا segfault إذا تجاوزت القراءة نهاية الملف ، أي أنه لا يتحقق مما إذا كانت القراءة ستتجاوز نهاية الملف. تؤدي هذه المشكلة إلى حدوث خلل في نظام التشغيل Ubuntu 16.04 ، ولكن يبدو أنه لا يتسبب في حدوث مشكلات في OSX.

مثال على إعادة إنتاج الكود:

import numpy as np

def test_read_from_file():
    # create an empty file named `empty.bin`
    filename = 'empty.bin'
    open(filename, 'a').close()

    # read large chunk of data, past the end of the file
    dtype = [('data', '<f4', 500,)]
    count = 100000000

    with open(filename, 'rb') as fh:
        data = np.fromfile(fh, dtype, count)

    print(data.shape)

رسالة خطأ:


انتهت العملية برمز الخروج 139 (تمت مقاطعته بواسطة الإشارة 11: SIGSEGV)

معلومات إصدار Numpy / Python:

منصة لينكس - Python 3.6.6 ، pytest-3.8.2 ، py-1.6.0 ، pluggy-0.7.1

00 - Bug numpy.core

التعليق الأكثر فائدة

أعتقد أن المشكلة هنا هي في الواقع أنك تحصل على MemoryError في ubuntu يتم التعامل معه بشكل غير صحيح ويتسبب في حدوث segfault.

العلاقات العامة مع الإصلاح هنا: https://github.com/numpy/numpy/pull/12354

ال 4 كومينتر

فقط للإشارة ، يمكن استنساخه على 1.15.3. أعتقد أننا نعرف الحجم ، لذلك من المفترض أن يؤدي هذا إلى ظهور خطأ أو قراءة الملف بالكامل. إذا كان هذا يعمل بصمت على بعض الأنظمة ، فربما يجب أن نضع ملاحظة إصدار فقط في حالة (ما زلت أقول أنه يمكننا إصلاحها فقط).

تحرير: كنت أميل إلى الخطأ ، فقط اعتقدت أن الملف بأكمله قد يكون خيارًا بسبب الفهرسة ، لكن الفهرسة خاصة بعض الشيء في هذا الصدد.

متفق عليه ، يبدو أن إثارة خطأ فكرة جيدة. لا يزال هناك شيء يمكن قوله عن القراءات الجزئية ، والتي يمكن التعامل معها بطريقتين:

  1. قراءة أكبر عدد ممكن من سجلات البيانات حتى نهاية الملف أو الوصول إلى count في fromfile ، ولكن بعد ذلك نحتاج إلى آلية لإعادة العدد الفعلي للسجلات التي تمت قراءتها (ضمنيًا) يجب أن يكون هذا مرئيًا في شكل المصفوفة الناتجة). لا يزال من الممكن ظهور خطأ لأنه ليس سيناريو الاستخدام العادي.
  2. لا تسمح بالقراءات الجزئية ، أي زيادة الحجم إذا كان الحجم المراد قراءته لا يتناسب مع بقية الملف.

لا أعرف أي السيناريوهات تتناسب بشكل أفضل مع الفلسفة المعقدة ، لكن الخيار الأول يبدو أكثر فائدة.

أعتقد أن الخطأ هو الأكثر منطقية. ما لست متأكدًا منه الآن هو ما إذا كان fromfile يدعم ملفًا مثل الكائنات التي ليس لها حجم معروف ، أو ما يحدث حاليًا في حالة sep kwarg غير الفارغة.

amuresan رمز fromfile موجود في C ، ولكن إذا كان لديك القليل من الوقت ، فنحن دائمًا سعداء جدًا بطلبات السحب ، ويبدو أنه من الصعوبة بمكان أن تشتغل قليلاً في C (Python) API.

أعتقد أن المشكلة هنا هي في الواقع أنك تحصل على MemoryError في ubuntu يتم التعامل معه بشكل غير صحيح ويتسبب في حدوث segfault.

العلاقات العامة مع الإصلاح هنا: https://github.com/numpy/numpy/pull/12354

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

القضايا ذات الصلة

thouis picture thouis  ·  4تعليقات

dmvianna picture dmvianna  ·  4تعليقات

navytux picture navytux  ·  4تعليقات

kevinzhai80 picture kevinzhai80  ·  4تعليقات

astrofrog picture astrofrog  ·  4تعليقات