seg fault avant la 1ere ligne du main !!??

seg fault avant la 1ere ligne du main !!?? - C - Programmation

Marsh Posté le 25-11-2004 à 00:43:07    

voilà, je suis entrain de recoder la commande Unix "pwd" en C, avec des opendir, des readdir et une petite pile FILO maison, et, comme je débute en C, je ne comprend pas trop pourquoi j'ai un seg fault au lancement du prog, alors que je n'ai aucune erreur à la compile.
 
j'ai mis un printf à la premiere ligne de mon main et il ne me l'affiche pas.
 
est ce qu'il parcourt les autres fonctions avant mon main et qu'il seg fault à cause d'une d'entre elles?
 
comment savoir où se situe le problème?

Reply

Marsh Posté le 25-11-2004 à 00:43:07   

Reply

Marsh Posté le 25-11-2004 à 00:49:43    

gcc -ggdb machin.c
gdb ./a.out
> run
> bt

Reply

Marsh Posté le 25-11-2004 à 00:59:24    

connaissais pas!
 
merci pour ce conseil plus qu'utile!

Reply

Marsh Posté le 25-11-2004 à 01:22:57    

euh, je suppose que quand le debugger m'indique une erreur dans strlen, je suppose obligatoirement que c'est un problème par rapport à ce que je lui passe en paramètre?
 
pourtant :
 
 
strlen(stack->doss);
 
avec
typedef struct s_stack
{
 char * doss;
 struct s_stack *next;
} t_stack
 
et
t_stack *stack;

Reply

Marsh Posté le 25-11-2004 à 01:35:28    

Tu n'aurais pas bouffer le caractère nul dans la chaine que tu lui passe en paramètre?
strlen va parcourir toute la zone mémoire à la recherche d'un 0, en déborder -> SIGSEGV
Utilise strnlen


Message édité par manatane le 25-11-2004 à 01:37:44
Reply

Marsh Posté le 25-11-2004 à 01:52:08    

merci pour ton aide
 
en fait j'ai fait un malloc pour mon char * doss en prenant bien strlen de ma chaine de caractère + 1 (pour le \0)
 
je pense pas que ça vienne de là finalement...
maintenant il me parle d'une erreur sur strcpy (!) donc je regarde ça...
 
 
 
pffff, quelle idée de partir en école d'info :sarcastic:

Reply

Marsh Posté le 25-11-2004 à 02:00:20    

bon, j'ai testé autre chose et il me trouve tjs une erreur :
 

Code :
  1. int cpt=0;
  2. cpt=strlen(stack->doss);


 
et j'ai toujours une erreur sur ma ligne du strlen :'(
 
ça peut pas etre un problème avec la forme de stack->doss ?
 
je comprend plus rien là :'(

Reply

Marsh Posté le 25-11-2004 à 02:04:12    

résolu!
 
j'ai rajouter un
 

Code :
  1. if (stack->doss)


 
l'erreur était gérée differement avant mais comme ça marche, enfin, maintenant il me trouve d'autres erreurs :sarcastic:


Message édité par ACYT le 25-11-2004 à 02:04:45
Reply

Marsh Posté le 25-11-2004 à 09:04:29    

ACYT > si ton code n'est pas trop gros tu peux toujours le poster.


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 25-11-2004 à 09:39:50    

euh tu l'alloues comment stack ?

Reply

Marsh Posté le 25-11-2004 à 09:39:50   

Reply

Marsh Posté le 25-11-2004 à 13:13:23    

je pense effectivement que le plus simple pour que vous puissiez comprendre serait de poster le code mais je suis sûr que vous allez trouver plein plein de chose pas bien dedans :whistle:
 
il fait environ 110 lignes, c'est trop?

Reply

Marsh Posté le 25-11-2004 à 13:53:54    

bon ben, voilà le code : (je suis ouvert à toute critique qui me permettrait de mieux coder!!)
 
désolé je n'ai pas encore commenté le code par contre  
 

Code :
  1. #include <dirent.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. typedef struct s_stack
  7. {
  8.   char *doss;
  9.   struct s_stack *next;
  10. } t_stack;
  11. t_stack * create_stack ()
  12. {
  13. t_stack *stack;
  14. stack = 0;
  15. return stack;
  16. }
  17. t_stack * push(t_stack *stack, char * data)
  18. {
  19. t_stack * elt;
  20. elt = malloc(sizeof(t_stack));
  21. elt->doss = malloc((strlen(data)+1)*sizeof(char));
  22. strcpy(elt->doss, data);
  23. elt->next=stack;
  24. stack=elt;
  25. // printf("j'ai bien pushé\n" );
  26. return (stack);
  27. }
  28. t_stack * pop(t_stack *stack)
  29. {if (stack != 0)
  30. {
  31. // printf("je pop" );
  32. char * tmp;
  33. int cpt=0;
  34. if (stack->doss)
  35. cpt=strlen(stack->doss);
  36. tmp = malloc((cpt+1)*sizeof(char));
  37. t_stack *tmp_free;
  38. if(stack->doss)
  39. tmp = strcpy(tmp , stack->doss);
  40. tmp_free = stack;
  41. stack=(stack->next);
  42. free(tmp_free);
  43. // printf("j'ai bien popé" );
  44. printf("/%s",tmp);
  45. free(tmp);
  46. return(stack);
  47. }
  48. return stack;
  49. }
  50. void aff(t_stack *stack)
  51. {
  52. while(stack != 0)
  53. {
  54. //  printf(" %d ",stack);
  55.   stack = pop(stack);
  56. //  printf(" %d ",stack);
  57.   if (stack==0);
  58. printf(" stack est deja à 0 " );
  59. }
  60. }
  61.  
  62. t_stack * pwd(int ino, t_stack *stack)
  63. {
  64.   struct dirent *s_dir;
  65.   DIR *dir;
  66.   chdir(".." );
  67.   s_dir = readdir(opendir("." ));
  68.   if (s_dir->d_ino != (readdir(opendir(".." )))->d_ino)
  69. pwd(s_dir->d_ino, stack);
  70.   dir = opendir("." );
  71.   while ((s_dir = readdir(dir)) && (s_dir->d_ino !=(unsigned)ino || *(s_dir->d_name) == '.'))
  72. ;
  73.   if (s_dir)
  74.   {
  75. stack= push(stack, s_dir->d_name);
  76. if(chdir(s_dir->d_name) < 0)
  77.  exit(1);
  78.   }
  79.   else
  80. printf("/" );
  81. return (stack);
  82. }
  83. int main ()
  84. {
  85.   t_stack *stack;
  86.   stack = create_stack();
  87.   stack = pwd(readdir(opendir("." ))->d_ino, stack);
  88. //  printf("donc je passe par là " );
  89.   aff(stack);
  90.   printf("\n" );
  91.   return (0);
  92. }


 
il y a quelques printf par ci par là qui m'ont permis de localiser l'erreur...

Reply

Marsh Posté le 25-11-2004 à 14:12:27    

ok problème résolu
j'avais juste oublié de récupérer stack à la ligne 83  :whistle:
 
 
 
me reste plus qu'à afficher le résultat dans le bon ordre

Reply

Marsh Posté le 25-11-2004 à 14:13:35    

c'est une blague ton create_stack ?

Reply

Marsh Posté le 25-11-2004 à 14:24:03    

euh.... oui?
après reflexion c'est sûr qu'elle sert à rien mais en fait au début j'étais parti sur une liste chaînée et j'initialisais beaucoup plus de chose dans cette fonction...
 
par contre je dois vraiment avoir fait une pile de merde pour qu'elle arrive à me ressortir les valeurs dans le mauvais sens :pfff:

Reply

Marsh Posté le 25-11-2004 à 14:27:32    

et puis, c'est NULL et pas 0

Reply

Marsh Posté le 25-11-2004 à 14:35:43    

un doute me prend : pourquoi si je rajoute un printf("/%s", s_dir->d_name);  
 
avant la ligne 89, il m'affiche directement le resultat sans passer par ma pile??
 
j'ai fait tout ça pour rien??
 
:'(


Message édité par ACYT le 25-11-2004 à 14:36:40
Reply

Marsh Posté le 25-11-2004 à 14:37:14    

ACYT a écrit :

j'ai fait tout ça pour rien??


Tu veux dire que tu aurais pu utiliser getcwd ?  
   http://man.he.net/man3/getcwd
 
edit: en plus, je crois que ton truc ne marche pas si le nom d'un de tes répertoires commence par un '.'


Message édité par Lam's le 25-11-2004 à 14:38:09
Reply

Marsh Posté le 25-11-2004 à 14:48:53    

bon ben voilà, je viens de supprimer ma pile et tout fonctionne avec juste un petit printf bien placé
 
j'ai la rage, j'ai bossé jusqu'à 3h30 pour ça ce matin
 
voilà le code final :
 
edit : en fait je le remettrai quand le projet sera rendu, pas envie que des petits malins le pompe entre temps
 
 
en tout cas merci à tous pour votre aide!
 
:hello:


Message édité par ACYT le 25-11-2004 à 16:38:16
Reply

Marsh Posté le 02-12-2004 à 23:30:27    

ACYT a écrit :

bon ben, voilà le code :  


Voici une version simplifiée et corrigée:  

Code :
  1. /* -ed-
  2. * Commentaires C90
  3. * suppression accents
  4. * Re-indentation
  5. * Suppression du code non portable
  6. * Test du mecanisme de stack.
  7. * Mise au point des liberation manquantes.
  8. */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. typedef struct s_stack
  13. {
  14.    char *doss;
  15.    struct s_stack *next;
  16. }
  17. t_stack;
  18. t_stack *push (t_stack * stack, char *data)
  19. {
  20.    t_stack *elt = malloc (sizeof (t_stack));
  21.    if (elt != NULL)
  22.    {
  23.       elt->doss = malloc (strlen (data) + 1);
  24.       strcpy (elt->doss, data);
  25.       elt->next = stack;
  26.       stack = elt;
  27.    }
  28.    return stack;
  29. }
  30. t_stack *pop (t_stack * stack)
  31. {
  32.    if (stack != NULL)
  33.    {
  34.       if (stack->doss)
  35.       {
  36.          printf ("/%s\n", stack->doss);
  37.       }
  38.       {
  39.          t_stack *tmp_free = stack;
  40.          stack = stack->next;
  41.          free (tmp_free->doss);
  42.          free (tmp_free);
  43.       }
  44.    }
  45.    return stack;
  46. }
  47. void aff (t_stack * stack)
  48. {
  49.    while (stack != NULL)
  50.    {
  51.       stack = pop (stack);
  52.       if (stack == NULL)
  53.       {
  54.          printf (" stack est deja a 0\n" );
  55.       }
  56.    }
  57. }
  58. int main (void)
  59. {
  60.    t_stack *stack = NULL;
  61.    stack = push (stack, "1" );
  62.    stack = push (stack, "2" );
  63.    stack = push (stack, "3" );
  64.    aff (stack);
  65.    return 0;
  66. }


Message édité par Emmanuel Delahaye le 03-12-2004 à 08:22:55
Reply

Sujets relatifs:

Leave a Replay

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