Numpy: Crash di `np.vdot` untuk objek seperti array

Dibuat pada 10 Agu 2019  ·  6Komentar  ·  Sumber: numpy/numpy

numpy.vdot mungkin segfault jika mengirimkan objek yang mengimplementasikan __array__ dengan cara yang tidak standar.

Segfault terjadi di baris kode ini:
https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/multiarraymodule.c#L2245
karena type mungkin NULL jika PyArray_DescrFromType gagal.

Contoh kode reproduksi:

import numpy as np

class Foo(object):
     def __array__(self, a):
         return self

np.vdot(Foo(), Foo())

Pesan eror:

Lacak balik:

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
  * frame #0: 0x0000000100cef88e _multiarray_umath.cpython-37m-darwin.so`array_vdot + 126
    frame #1: 0x00000001005e0994 python`PyCFunction_Call + 148
    frame #2: 0x0000000100c48dc1 _multiarray_umath.cpython-37m-darwin.so`array_implement_array_function + 305
    frame #3: 0x00000001005e11b3 python`_PyMethodDef_RawFastCallKeywords + 227
    frame #4: 0x00000001005e071c python`_PyCFunction_FastCallKeywords + 44
    frame #5: 0x00000001006b6048 python`call_function + 664
    frame #6: 0x00000001006b2a18 python`_PyEval_EvalFrameDefault + 27080
    frame #7: 0x00000001006b6e45 python`_PyEval_EvalCodeWithName + 2997
    frame #8: 0x00000001005e06d6 python`_PyFunction_FastCallKeywords + 230
    frame #9: 0x00000001006b60d9 python`call_function + 809
    frame #10: 0x00000001006b2987 python`_PyEval_EvalFrameDefault + 26935
    frame #11: 0x00000001006b6e45 python`_PyEval_EvalCodeWithName + 2997
    frame #12: 0x00000001006abfb0 python`PyEval_EvalCode + 48
    frame #13: 0x00000001006ee677 python`PyRun_InteractiveOneObjectEx + 615
    frame #14: 0x00000001006ede4e python`PyRun_InteractiveLoopFlags + 190
    frame #15: 0x00000001006edd5c python`PyRun_AnyFileExFlags + 60
    frame #16: 0x0000000100710c51 python`pymain_main + 7873
    frame #17: 0x000000010071127f python`_Py_UnixMain + 111
    frame #18: 0x00007fff5f6e63d5 libdyld.dylib`start + 1

Informasi versi Numpy / Python:

Saya telah mereproduksi ini di Mac OS X dengan:

1.17.0 3.7.2 (default, Jan 16 2019, 11:36:28)
[Clang 10.0.0 (clang-1000.11.45.2)]

dan pada build Linux internal.

Masalah ini awalnya dilaporkan sebagai https://github.com/google/jax/issues/1162

00 - Bug

Semua 6 komentar

Hmm, vdot memeriksa output dtype apa yang akan dilakukan sebelumnya (yang menurut saya baik-baik saja). Namun, fungsi itu bisa gagal dan mengembalikan NPY_NOTYPE , jadi seharusnya mengembalikan kesalahan saat NPY_NOTYPE dikembalikan. Ini ada di https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/multiarraymodule.c#L2241 (dan baris berikut), kesalahan yang Anda lihat adalah kesalahan kembali nanti, tetapi saya pikir fungsi itu seharusnya tidak mengembalikan kesalahan (meskipun akan baik-baik saja untuk menambahkan pemeriksaan kesalahan di sana juga).

Apakah Anda ingin membuat PR?

(Sebaiknya periksa apakah ada lebih banyak penggunaan serupa di mana pemeriksaan kesalahan hilang.)

Hai,
Saya seorang pendatang baru dan ingin menangani masalah ini. Ada petunjuk dari mana harus memulai?
Terima kasih sebelumnya.

Baca tentang alur kerja pengembangan kami. Kemudian Anda harus mencapai titik di mana Anda dapat menjalankan python runtests.py dari cabang master ( git checkout master; git clean -xfd; python runtests.py ).

Saat Anda siap, Anda dapat mulai meretas: buat cabang, tambahkan tes yang gagal ( numpy/core/tests/teste_multiarray.py di TestVDot akan menjadi tempat yang baik), coba perbaiki kode C dari petunjuk di atas . Jika Anda buntu, jangan ragu untuk meminta bantuan, semakin Anda dapat menunjukkan bahwa Anda melakukan upaya yang benar untuk mengikuti dokumentasi dan petunjuk semakin baik.

Selamat datang @ Soniyanayak51!

Untuk menambahkan apa yang dikatakan @mattip : satu bit info yang hilang dari dokumen kami (menurut saya) adalah cara kami menangani masalah. Kami tidak menggunakan fitur "penerima tugas" GitHub, jadi kecuali jelas dari komentar / PR terbaru bahwa seseorang secara aktif mengerjakan suatu masalah, Anda dapat langsung menyelami.

@ rgommers @ mattip Saya telah menambahkan pemeriksaan untuk jenis yang diperoleh dari PyArray_DescrFromType (). Saya tidak yakin apakah saya harus menambahkannya untuk PyArray_DESCR () juga.
Juga, tentang menambahkan tes dalam test_multiarray.py, haruskah saya menambahkan test_PyArrayType dan menambahkan tes dengan tipe NULL? Saya tidak yakin bagaimana melanjutkan dengan menambahkan tes.

@ rgommers @ mattip Saya telah menambahkan pemeriksaan untuk jenis yang diperoleh dari PyArray_DescrFromType (). Saya tidak yakin apakah saya harus menambahkannya untuk PyArray_DESCR () juga.
Juga, tentang menambahkan tes dalam test_multiarray.py, haruskah saya menambahkan test_PyArrayType dan menambahkan tes dengan tipe NULL? Saya tidak yakin bagaimana melanjutkan dengan menambahkan tes.

Sepertinya @ mattip menjawab ini sebagian di PR (saya pikir). Mungkin lebih baik menjaga percakapan di sana.

haruskah saya menambahkan test_PyArrayType dan menambahkan tes dengan tipe NULL?

Untuk menambahkan sedikit: prinsip untuk menambahkan pengujian biasanya adalah hanya menguji API publik. Jadi Anda akan mengambil

...
np.vdot(Foo(), Foo())

dari deskripsi masalah di atas, dan tambahkan itu sebagai ujian. Sepertinya tidak perlu menguji C API secara terpisah.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat