Numpy: 配列のようなオブジェクトの `np.vdot`でクラッシュ

作成日 2019年08月10日  ·  6コメント  ·  ソース: numpy/numpy

numpy.vdotは、非標準的な方法で__array__を実装するオブジェクトを渡された場合、セグメンテーション違反になる可能性があります。

セグメンテーション違反は、次のコード行で発生します。
https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/multiarraymodule.c#L2245
PyArray_DescrFromTypeが失敗した場合、 typeNULLなる可能性があるためです。

コード例の再現:

import numpy as np

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

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

エラーメッセージ:

バックトレース:

(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

Numpy / Pythonのバージョン情報:

私はこれをMacOSXの両方で次のように再現しました。

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

および内部Linuxビルド。

この問題は元々 https://github.com/google/jax/issues/1162として報告されていました

00 - Bug

全てのコメント6件

うーん、 vdotは、出力dtypeが何になるかを事前にチェックします(これで問題ないと思います)。 ただし、その関数は失敗してNPY_NOTYPEを返す可能性があるため、 NPY_NOTYPEが返されるとエラーが返されるはずです。 これはhttps://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/multiarraymodule.c#L2241 (および次の行)にあります。表示されるエラーは、後でエラーが返されることです。しかし、関数は実際にはエラーを返さないはずだと思います(ただし、そこにエラーチェックを追加することもできます)。

PRをしたいですか?

(エラーチェックが欠落している同様の使用法が他にもあるかどうかを確認するとよいでしょう。)

こんにちは、
私は新参者であり、この問題に取り組みたいと思っています。 どこから始めればよいのでしょうか?
前もって感謝します。

開発ワークフローについてお読みください。 次に、 masterブランチ( git checkout master; git clean -xfd; python runtests.py )からpython runtests.py実行できるポイントに到達する必要があります。

あなたが設定されている場合、あなたはハッキングを開始することができます:失敗テスト(追加、ブランチを作成numpy/core/tests/teste_multiarray.pyTestVDot良い場所でしょう)、上記のヒントからCコードを修正しよう。 行き詰まった場合は、遠慮なく助けを求めてください。ドキュメントとヒントに従うために真の努力をしたことを示すことができます。

ようこそ@ Soniyanayak51!

@mattipが言ったことに加えて、私たちのドキュメントに欠けている情報の1つは、問題への取り組み方です。 GitHubの「担当者」機能は使用していません。そのため、最近のコメント/ PRから誰かが問題に積極的に取り組んでいることが明らかでない限り、ただ飛び込むことができます。

@rgommers @mattip PyArray_DescrFromType()から取得した型のチェックを追加しました。 PyArray_DESCR()にも追加する必要があるかどうかはわかりません。
また、test_multiarray.pyにテストを追加することについて、test_PyArrayTypeを追加し、タイプがNULLのテストを追加する必要がありますか? テストの追加を進める方法がわかりません。

@rgommers @mattip PyArray_DescrFromType()から取得した型のチェックを追加しました。 PyArray_DESCR()にも追加する必要があるかどうかはわかりません。
また、test_multiarray.pyにテストを追加することについて、test_PyArrayTypeを追加し、タイプがNULLのテストを追加する必要がありますか? テストの追加を進める方法がわかりません。

@mattipがPRでこれに部分的に答えたよう

test_PyArrayTypeを追加し、タイプがNULLのテストを追加する必要がありますか?

少し追加すると、通常、テストを追加するための原則は、パブリックAPIのみをテストすることです。 だからあなたは取るだろう

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

上記の問題の説明から、それをテストとして追加します。 CAPIを個別にテストする必要はないようです。

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

関連する問題

marcocaccin picture marcocaccin  ·  4コメント

dmvianna picture dmvianna  ·  4コメント

inducer picture inducer  ·  3コメント

kevinzhai80 picture kevinzhai80  ·  4コメント

astrofrog picture astrofrog  ·  4コメント