Numpy: Absturz in `np.vdot` für Array-ähnliches Objekt

Erstellt am 10. Aug. 2019  ·  6Kommentare  ·  Quelle: numpy/numpy

numpy.vdot kann fehlerhaft sein, wenn ein Objekt übergeben wird, das __array__ auf nicht standardmäßige Weise implementiert.

Der Segfault tritt in dieser Codezeile auf:
https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/multiarraymodule.c#L2245
da type NULL wenn PyArray_DescrFromType fehlschlägt.

Beispiel für die Wiedergabe von Code:

import numpy as np

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

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

Fehlermeldung:

Rückverfolgung:

(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-Versionsinformationen:

Ich habe dies beide unter Mac OS X reproduziert mit:

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

und auf einem internen Linux-Build.

Dieses Problem wurde ursprünglich als https://github.com/google/jax/issues/1162 gemeldet

00 - Bug

Alle 6 Kommentare

Hmm, vdot prüft vorab, wie der Ausgabetyp aussehen wird (was meiner Meinung nach in Ordnung ist). Diese Funktion kann jedoch fehlschlagen und NPY_NOTYPE . Daher sollte ein Fehler zurückgegeben werden, wenn NPY_NOTYPE zurückgegeben wird. Dies ist in https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/multiarraymodule.c#L2241 (und der folgenden Zeile) der Fehler, den Sie sehen, ist eine Fehlerrückgabe später. aber ich denke, dass die Funktion wirklich keinen Fehler zurückgeben sollte (obwohl es in Ordnung wäre, dort auch eine Fehlerprüfung hinzuzufügen).

Willst du eine PR machen?

(Könnte schön sein zu überprüfen, ob es ähnlichere Verwendungen gibt, bei denen die Fehlerprüfung fehlt.)

Hallo,
Ich bin ein Neuling und möchte an diesem Thema arbeiten. Irgendwelche Hinweise, wo ich anfangen soll?
Danke im Voraus.

Lesen Sie mehr über unseren Entwicklungsworkflow . Dann sollten Sie zu einem Punkt kommen, an dem Sie python runtests.py aus dem Zweig master ( git checkout master; git clean -xfd; python runtests.py ) ausführen können.

Wenn Sie eingerichtet sind, können Sie mit dem Hacken beginnen: Erstellen Sie einen Zweig, fügen Sie einen fehlgeschlagenen Test hinzu ( numpy/core/tests/teste_multiarray.py in TestVDot wäre ein guter Ort), und versuchen Sie, den C-Code anhand des obigen Hinweises zu korrigieren . Wenn Sie nicht weiterkommen, können Sie um Hilfe bitten. Je mehr Sie nachweisen können, dass Sie sich wirklich bemüht haben, die Dokumentation und Hinweise zu befolgen, desto besser.

Willkommen bei Soniyanayak51!

Um das hinzuzufügen, was @mattip gesagt hat: Eine Information, die in unseren Dokumenten fehlt (glaube ich), ist, wie wir an Problemen arbeiten. Wir verwenden die GitHub-Funktion "Beauftragte" nicht. Wenn aus den jüngsten Kommentaren / PRs nicht hervorgeht, dass jemand aktiv an einem Problem arbeitet, können Sie einfach eintauchen.

@rgommers @mattip Ich habe Prüfungen für Typen hinzugefügt, die von PyArray_DescrFromType () erhalten wurden. Ich bin mir nicht sicher, ob ich sie auch für PyArray_DESCR () hinzufügen soll.
Sollte ich zum Hinzufügen von Tests in test_multiarray.py einen test_PyArrayType hinzufügen und Tests hinzufügen, bei denen der Typ NULL ist? Ich bin mir nicht sicher, wie ich mit dem Hinzufügen von Tests fortfahren soll.

@rgommers @mattip Ich habe Prüfungen für Typen hinzugefügt, die von PyArray_DescrFromType () erhalten wurden. Ich bin mir nicht sicher, ob ich sie auch für PyArray_DESCR () hinzufügen soll.
Sollte ich zum Hinzufügen von Tests in test_multiarray.py einen test_PyArrayType hinzufügen und Tests hinzufügen, bei denen der Typ NULL ist? Ich bin mir nicht sicher, wie ich mit dem Hinzufügen von Tests fortfahren soll.

Sieht so aus, als hätte @mattip dies teilweise in der PR beantwortet (glaube ich). Wahrscheinlich besser, um das Gespräch dort zu halten.

sollte ich einen test_PyArrayType hinzufügen und Tests hinzufügen, bei denen der Typ NULL ist?

Um ein wenig hinzuzufügen: Das Prinzip für das Hinzufügen von Tests besteht normalerweise darin, nur die öffentliche API zu testen. Also würdest du nehmen

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

aus der obigen Problembeschreibung und fügen Sie dies als Test hinzu. Es sieht nicht so aus, als müsste die C-API separat getestet werden.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Levstyle picture Levstyle  ·  3Kommentare

toddrjen picture toddrjen  ·  4Kommentare

manuels picture manuels  ·  3Kommentare

perezpaya picture perezpaya  ·  4Kommentare

inducer picture inducer  ·  3Kommentare