Numpy: Données invalides et erreur de segmentation lors de la lecture au-delà de la taille du fichier avec fromfile sur Ubuntu 16.04

Créé le 31 oct. 2018  ·  4Commentaires  ·  Source: numpy/numpy


fromfile données invalides et parfois segfault en cas de lecture au-delà de la fin d'un fichier, c'est-à-dire qu'il ne vérifie pas si la lecture va au-delà de la fin du fichier. Ce problème conduit à un segfault sur Ubuntu 16.04, mais ne semble pas segfault sur OSX.

Exemple de code de reproduction:

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)

Message d'erreur:


Processus terminé avec le code de sortie 139 (interrompu par le signal 11: SIGSEGV)

Informations sur la version Numpy / Python:

plateforme linux - Python 3.6.6, pytest-3.8.2, py-1.6.0, pluggy-0.7.1

00 - Bug numpy.core

Commentaire le plus utile

Je crois que le problème ici est en fait que sur ubuntu, vous obtenez un MemoryError qui est mal géré et qui provoque l'erreur de segmentation.

Un PR avec un correctif est ici: https://github.com/numpy/numpy/pull/12354

Tous les 4 commentaires

Juste à noter, reproductible sur 1.15.3. Je suppose que nous connaissons la taille, donc cela devrait simplement générer une erreur ou lire le fichier entier. Si cela fonctionne silencieusement sur certains systèmes, nous devrions peut-être mettre une note de publication au cas où (je dirais toujours que nous pouvons simplement le réparer).

EDIT: J'aurais tendance à me tromper, je pensais juste que le fichier entier pourrait être une option en raison de l'indexation, mais l'indexation est un peu spéciale à cet égard.

D'accord, signaler une erreur semble être une bonne idée. Il y a encore quelque chose à dire sur les lectures partielles, qui pourraient être gérées de deux manières:

  1. lire autant d'enregistrements de données que possible jusqu'à la fin du fichier ou le count dans fromfile est atteint, mais nous avons alors besoin d'un mécanisme pour renvoyer explicitement le nombre réel d'enregistrements qui ont été lus (implicitement cela doit être visible sous la forme du tableau résultant). Une erreur peut toujours être générée car ce n'est pas le scénario d'utilisation normal.
  2. ne pas autoriser les lectures partielles, c'est-à-dire augmenter si la taille à lire ne rentre pas dans le reste du fichier.

Je ne sais pas quels scénarios correspondent le mieux à la philosophie numpy, mais la première option semble plus utile.

Je pense qu'une erreur est la plus raisonnable. Ce dont je ne suis pas sûr pour le moment, c'est si fromfile prend en charge les fichiers comme les objets qui n'ont pas une taille connue, ou ce qui se passe actuellement dans le cas de sep kwarg non vide.

@amuresan le code de fromfile est en C, mais si vous avez un peu de temps, nous sommes toujours très satisfaits des pull requests, et cela semble être une difficulté raisonnable de se plonger un peu dans l'API C (Python).

Je crois que le problème ici est en fait que sur ubuntu, vous obtenez un MemoryError qui est mal géré et qui provoque l'erreur de segmentation.

Un PR avec un correctif est ici: https://github.com/numpy/numpy/pull/12354

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

MorBilly picture MorBilly  ·  4Commentaires

dmvianna picture dmvianna  ·  4Commentaires

Foadsf picture Foadsf  ·  3Commentaires

inducer picture inducer  ·  3Commentaires

toddrjen picture toddrjen  ·  4Commentaires