Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1784 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Erreur de segmentation fgets avec GCC

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur de segmentation fgets avec GCC

n°2043058
Svensl
woof ?
Posté le 18-12-2010 à 21:35:28  profilanswer
 

Help  :o  
 
J'ai ceci :
 

Code :
  1. instr_s* read_file(char *name) {
  2.   FILE *fd;
  3.   char line[255];
  4.   char line_tmp[9];
  5.   instr_s *ret;
  6.   uint32_t i, size;
  7.   word *mem;
  8. printf("fonction read_file :\n" );
  9.   /*  reservation de la memoire pour stocker toutes les instructions  */
  10.   size = 10;
  11.   if ((mem = malloc(sizeof(mem) * size)) == NULL) {
  12.     fputs("erreur: impossible d'allouer la memoire pour la lecture\n", stderr);
  13.     exit(-1);
  14.   }
  15.   /*  ouverture du fichier specifie en lecture seule  */
  16.   if ((fd = fopen(name, "r" )) == NULL) {
  17.     fprintf(stderr, "erreur: impossible d'ouvrir le fichier %s\n", name);
  18.     exit(-1);
  19.   }
  20. printf("avant fgets\n" );
  21.   /*  lecture fichier ligne par ligne et stocke chaque instruction dans mem  */
  22.   i = 0;
  23.   while (fgets(line, 255, fd) != NULL) {
  24. printf("ok while\n" );
  25. printf("ok while : i = %d\n",i);
  26.     /* recupération de la premiere partie de l'instruction (op-code, suffixe et registre(s)) */
  27.     strncpy(line_tmp,line+2,8);
  28.     mem[i].part1 = str_to_uint64(line_tmp);
  29. printf("mem[%d].part1 ok\n",i);
  30.     /* recuperation de la seconde partie contenant la constante imm */
  31.     strncpy(line_tmp,line+10,8);
  32.     mem[i].part2 = i3e754_to_float(str_to_uint64(line_tmp));
  33. printf("mem[%d].part2 ok\n",i);
  34.     i++;printf("avt if\n" );
  35.     if (i >= size) {
  36.       size *= 2;
  37.       /*  si on n'a pas assez de place on double la taille  */
  38.       if ((mem = (word*) realloc(mem, sizeof(mem) * size)) == NULL) {
  39. fputs("erreur: impossible d'allouer la memoire pour la lecture\n", stderr);
  40. exit(-1);
  41.       }
  42.     }
  43.     printf("fgets(line, 255, fd) : %d\n",(fgets(line, 255, fd)));
  44.     printf("fin pour i = %d\n",i-1);
  45.   }
  46.   /*  fermeture du fichier  */
  47.   fclose(fd);
  48.   fd = NULL;


 
Je compile avec GCC, et je débug avec GDB.
 
Et j'ai une erreur de segmentation à la 6ème itération de la boucle.
 
J'ai Mot1, Mot2, Mot3 etc et ça s'arrête à Mot6, apparemment fgets me renvoit un null.
 
Je patine, j'ai bien googlisé mais je sèche  :(  
 

mood
Publicité
Posté le 18-12-2010 à 21:35:28  profilanswer
 

n°2043067
billgatesa​nonym
Posté le 19-12-2010 à 01:16:41  profilanswer
 

C'est probablement, comme d'habitude, à cause de l'oubli de mettre un zéro binaire à la fin d'une chaîne de caractère.
 
Par exemple, la fonction str_to_uint64() nécessite une chaine de caractères ayant un zéro binaire à la fin. Or il n'y a pas de garantie que line_tmp contiennent un zéro binaire de fin de chaîne.

n°2044025
Svensl
woof ?
Posté le 23-12-2010 à 12:23:58  profilanswer
 

T'as un grand merci de la part du pote qui avait ce problème  :o


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Erreur de segmentation fgets avec GCC

 

Sujets relatifs
Erreur [1045] Access denied ?Erreur d'autocomplete sous IE (... voiture pleine ?)
Erreur connection local MySQL / MySQL connectorErreur lors de la création d'un projet sous Visual Studio
[C]Récupérer un espace avec fgets[VBS] Erreur WScript.CreateObject avec runtime access 2003
Erreur /includes/session.phpIncompatibilité de type Erreur 13 VBA
Erreur dll runtime[PostrgreSQL] trigger, erreur de symtaxe
Plus de sujets relatifs à : Erreur de segmentation fgets avec GCC


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR