Erreur de segmentation fgets avec GCC

Erreur de segmentation fgets avec GCC - C - Programmation

Marsh Posté le 18-12-2010 à 21:35:28    

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

Reply

Marsh Posté le 18-12-2010 à 21:35:28   

Reply

Marsh Posté le 19-12-2010 à 01:16:41    

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.

Reply

Marsh Posté le 23-12-2010 à 12:23:58    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed