IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Cause d'un segmentation fault


Sujet :

Caml

  1. #1
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut Cause d'un segmentation fault
    J'ai trouvé via le Wayback machine le vieux shootout de Doug Bagley (l'ancêtre de l'actuel Computer Language Shootout). On y trouve notament un programme qui fait la somme des entiers dans un fichier. Voici la solution de l'époque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    let sum = ref 0
    let rec loop () = sum := !sum + read_int (); loop ()
    let _ = try loop () with End_of_file -> Printf.printf "%d\n" !sum
    Je n'aimais pas trop l'utilisation d'un ref, donc j'ai décidé de ré-écrire le programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    let rec sumfile sum =
      try sumfile (sum + read_int ())
      with End_of_file -> sum
     
    let _ = Printf.printf "%d\n" (sumfile 0)
    Malheureusement, avec un très gros fichier (seq 1 1000000 > fichier.txt), ce nouveau programme plante avec une segmentation fault. Quelqu'un pourrait m'expliquer pourquoi?

  2. #2
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonjour,

    Amusant, je m'attendais à une erreur de type stack_overflow. En effet, l'appel récursif de la fonction sumfile est dans try...with, ce qui implique d'empiler les appels successifs. Si le fichier est très gros tu dois saturer la pile d'appels. L'utilisation d'une référence permet d'éviter ce problème. Essaie cette version sur ton gros fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    let rec sumfile sum =
      match try Some (read_int ()) with End_of_file -> None with
      | None -> sum
      | Some x -> sumfile (sum + x)
    Pourquoi segfault et pas stack_overflow ? Je n'ai pas de réponse claire à ce sujet. Je crois me souvenir que certaines versions d'OCaml déclenchent une segfault en cas de débordement de pile sur certaines plateformes, mais bof... vieux souvenir douteux, donc je n'affirme rien.

    Edit : en bytecode tu as bien Stack_overflow. C'est en natif seulement que j'obtiens une segfault.


    Cordialement,
    Cacophrène

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let sum = ref 0 in begin
      try while true do
        sum := !sum + read_int ()
      done with End_of_file ->
        print_int !sum; print_newline ()
    end

  4. #4
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonjour,

    En utilisant une référence et un while, on en revient à la solution de Doug Bagley. Notez aussi que le résultat est négatif parce qu'on dépasse max_int avec un gros fichier.

    Cordialement,
    Cacophrène

  5. #5
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Merci Cacophrene, toujours très informatif de vous lire.

    Bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur : Segmentation fault: 11 a cause d'un delegate
    Par yanouil dans le forum Général Python
    Réponses: 2
    Dernier message: 05/12/2013, 11h36
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo