Numpy: Ungültige Daten und Segfault beim Lesen über die Dateigröße mit fromfile unter Ubuntu 16.04 hinaus

Erstellt am 31. Okt. 2018  ·  4Kommentare  ·  Quelle: numpy/numpy


fromfile ungültige Daten und manchmal Segfault, wenn das Lesen über das Ende einer Datei hinausgeht, dh es wird nicht überprüft, ob das Lesen über das Dateiende hinausgeht. Dieses Problem führt unter Ubuntu 16.04 zu einem Segfault, unter OSX scheint es jedoch keinen Segfault zu geben.

Beispiel für die Wiedergabe von Code:

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)

Fehlermeldung:


Prozess beendet mit Exit-Code 139 (unterbrochen durch Signal 11: SIGSEGV)

Numpy / Python-Versionsinformationen:

Plattform Linux - Python 3.6.6, pytest-3.8.2, py-1.6.0, pluggy-0.7.1

00 - Bug numpy.core

Hilfreichster Kommentar

Ich glaube, das Problem hier ist tatsächlich, dass Sie auf Ubuntu ein MemoryError , das falsch behandelt wird und den Segfault verursacht.

Eine PR mit einem Fix finden Sie hier: https://github.com/numpy/numpy/pull/12354

Alle 4 Kommentare

Nur zu beachten, reproduzierbar am 1.15.3. Ich denke, wir kennen die Größe, daher sollte dies nur einen Fehler auslösen oder die gesamte Datei lesen. Wenn dies auf einigen Systemen unbeaufsichtigt funktioniert, sollten wir für alle Fälle möglicherweise eine Versionshinweis einfügen (ich würde immer noch sagen, dass wir das Problem einfach beheben können).

BEARBEITEN: Ich würde eher Fehler machen, dachte nur, dass eine ganze Datei aufgrund der Indizierung eine Option sein könnte, aber die Indizierung ist in dieser Hinsicht etwas Besonderes.

Einverstanden, einen Fehler auszulösen, klingt nach einer guten Idee. Es gibt noch etwas zu sagen über Teillesungen, die auf zwei Arten gehandhabt werden können:

  1. Lesen Sie so viele Datensätze wie möglich, bis entweder das Dateiende oder das count in fromfile erreicht ist. Dann benötigen wir jedoch einen Mechanismus, um die tatsächliche Anzahl der gelesenen Datensätze (implizit) explizit zurückzugeben Dies sollte in der Form des resultierenden Arrays sichtbar sein. Ein Fehler kann weiterhin ausgelöst werden, da dies nicht das normale Verwendungsszenario ist.
  2. Lassen Sie keine Teillesevorgänge zu, dh erhöhen Sie sie, wenn die zu lesende Größe nicht in den Rest der Datei passt.

Ich weiß nicht, welche Szenarien besser zur Numpy-Philosophie passen, aber die erste Option klingt nützlicher.

Ich denke, ein Fehler ist am vernünftigsten. Was ich momentan nicht sicher bin, ist, ob fromfile dateiähnliche Objekte unterstützt, deren Größe nicht bekannt ist, oder was derzeit bei nicht leerem sep kwarg passiert.

@amuresan Der Code für fromfile ist in C, aber wenn Sie etwas Zeit haben, freuen wir uns immer sehr über Pull-Anfragen, und es scheint eine vernünftige Schwierigkeit zu sein, ein wenig in die C (Python) -API einzusteigen.

Ich glaube, das Problem hier ist tatsächlich, dass Sie auf Ubuntu ein MemoryError , das falsch behandelt wird und den Segfault verursacht.

Eine PR mit einem Fix finden Sie hier: https://github.com/numpy/numpy/pull/12354

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen