Numpy: 对于类似数组的对象,在“ np.vdot”中崩溃

创建于 2019-08-10  ·  6评论  ·  资料来源: numpy/numpy

如果传递了以非标准方式实现__array__的对象,则numpy.vdot可能会出现段错误。

段错误发生在以下代码行中:
https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/multiarraymodule.c#L2245
因为如果PyArray_DescrFromType失败,则type可能是NULL

再现代码示例:

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版本信息:

我已经在Mac OS X上使用以下命令复制了这两者:

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 (和下一行)中,您看到的错误是稍后返回的错误,但我认为该函数确实不应返回错误(尽管也可以在其中添加错误检查)。

你想做公关吗?

(最好检查是否缺少错误检查的更多类似用法。)

你好,
我是新来者,并且想解决这个问题。 任何线索从哪里开始?
提前致谢。

阅读有关我们的开发工作流程的信息。 然后,您应该可以在master分支( git checkout master; git clean -xfd; python runtests.py )上运行python runtests.py

设置好之后,您可以开始黑客攻击:创建一个分支,添加一个失败的测试( numpy/core/tests/teste_multiarray.py中的TestVDot是个好地方),尝试从上面的提示中修复C代码。 。 如果您陷入困境,可以随时寻求帮助,则可以表明您为遵循本文档做出了真正的努力,并且暗示更好。

欢迎@ Soniyanayak51!

要补充@mattip所说的话:我们的文档(我认为)中缺少的一些信息是我们在问题上的工作方式。 我们不使用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())

从上面的问题描述中,并将其添加为测试。 看起来没有必要单独测试C API。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

valentinstn picture valentinstn  ·  61评论

InonS picture InonS  ·  70评论

Caiptain1 picture Caiptain1  ·  171评论

ricardoV94 picture ricardoV94  ·  53评论

jakirkham picture jakirkham  ·  55评论