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

C Discussion :

Soucis de liste chainees en refaisant la fonction ls.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 9
    Par défaut Soucis de liste chainees en refaisant la fonction ls.
    Bonjour a tous !

    Je dois en ce moment refaire la fonction ls. Sauf que jai un soucis de segfault (completement aleatoire) sur l'option -R.

    Je pense que c'est du au content d'un des maillon de ma liste que serait faux.. Ca nest qu'une supposition. Voici les deux fonctions principales :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    void ft_fill_lst(t_list **lst, char *arg, char *root)
    {
        t_info *info;
        char *tmp;
     
        if (!ft_strequ(root, arg))
        {
            tmp = ft_strjoin(root, "/");
            arg = ft_strjoin(tmp, arg);
        }
        info = (t_info *)malloc(sizeof(t_info));
        lstat(arg, &info->buf)) == -1;
        info->name = ft_strdup(arg);
        ft_lstadd(lst, ft_lstnew(info, sizeof(t_info)));
    }
     
    void    ft_isdir(t_list *lst, t_options option, int j)
    {
        DIR *dir;
        t_list *list;
        struct dirent * dirent;
     
        while (lst)
        {
            if (((t_info *)(lst->content)) && (S_IFMT & ((t_info *)(lst->content))->buf.st_mode) == S_IFDIR)
            {
                if (!(dir = opendir(((t_info *)(lst->content))->name)))
                    perror(((t_info *)(lst->content))->name);
                if (j > 1)
                    printf("\n\n%s:\n", ((t_info *)(lst->content))->name);
                while ((dirent = readdir(dir)))
                {
                    if (option.all == 1 || (dirent->d_name[0] != '.'))
                    {
                        ft_fill_lst(&((t_info *)(lst->content))->for_dir, dirent->d_name, ((t_info *)(lst->content))->name);
                        list = ((t_info *)(lst->content))->for_dir;
                        if (list && dirent->d_name[0] != '.' && option.recursive == 1 && S_ISDIR(((t_info *)(list->content))->buf.st_mode)) /* Cest ici que je segfault, quand jessaye d'acceder au content*/
                            ft_isdir(list, option, j);
                    }
                }
                closedir(dir);
            }
            lst = lst->next;
        }
        list = NULL;
    }
    for_dir etant la nouvelles liste chainees que je remplis lorsque dans la premiere list "lst" je croise un directory.

    Merci a tous !

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Pour vérifier la santé d'une liste chaînée, tu peux tenter la méthode paranoiaque: Une liste doublement chaînée, une méthode CheckList() qui vérifie toute la chaîne en vérifiant à chaque fois que deux maillons pointent forcément l'un sur l'autre, et possiblement d'autres mesures de redondance: Maillon pointant sur sa liste d'origine, indicateur d'état dans chaque maillon, etc. Avec ça, s'il y a un bug dans tes fonctions de gestion de liste, il est vite trouvé.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 33
    Par défaut
    Salut,

    Vérifie le retour de tes malloc (ft_strjoin, ft_strdup, ft_lstnew...) tu n'est pas à l'abri d'un segfault en tentant de déréférencer un NULL que t'aurais renvoyé malloc (peu probable je te l'accorde, mais tu n'en auras le coeur net qu'une fois que se sera fait.).

    Il nous faudrait plus de code pour avoir une vision d'ensemble, notamment la lstnew et lstadd, et surtout ton t_info, buf est bien déclaré 'struct stat buf' ?

    De même que pour malloc il t faudrait plus de gestion d'erreurs tout au long de ton programme, lstat par exemple.

    Tu as une fuite mémoire sur tmp (ligne 13) si je ne m'abuse, pas bien méchant, mais si c'est que sur de très gros ls que ton programme se casse les dents, ben ça plus les malloc non protégés... Ben tu m'as compris ^^

    Si tu es VRAIMENT SUR que c'est ton déréférencement sur lst->content qui provoque le segfault, alors tu as ta réponse! Si je ne me trompe pas, lst->content est le retour d'un malloc + copie du premier argument de ta lstnew, (d'ailleurs si le segfault n'arrive pas à ce moment là, c'est que la copie ne se lance pas..) donc c'est que ce malloc foire! Et que tu essais de déréférencer NULL.

    Toujours si tu es vraiment sur de ton diagnostique, écris dans un fichier la valeur de tes adresses dans tes lst->content (via fprintf ou dprintf et une redirection) si tu vois passer un 0x0 tu en auras le coeur net

    Bon courage!

    PS: Et la norme dans tout ça!! :p

  4. #4
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 9
    Par défaut
    Bonjour a tous!

    Merci pour vos reponses, cest gentil de votre part
    Et oui la norme .. Mon code nest vraiment pas propre, (le -1 de test au lsat que jai oublie d'enlever apres le test par exemple ...)cetait une nouvelle tentative vu que mon ancien segaufltait aussi !
    Au final jai reussi a regler le probleme en mettant ma list for_dir a null dans la fonction fill_lst !
    Et merci pour la remarque sur la fuite de memoire, je vais regle ca de suite, ainsi que la protection de mon malloc ..
    Je garde vos conseils bien au chaud au cas ou je me trompe de nouveau dans la gestion de mes listes dans un code.

    Encore merci et bonne journee !

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

Discussions similaires

  1. Liste chainee & fonction dans une structure
    Par problems99 dans le forum Débuter
    Réponses: 1
    Dernier message: 30/08/2010, 13h07
  2. souci liste chainee
    Par mdabire dans le forum C
    Réponses: 1
    Dernier message: 13/04/2008, 09h58
  3. [LG]liste chainee + pointeur + affichage
    Par k_ro dans le forum Langage
    Réponses: 6
    Dernier message: 17/01/2004, 13h58
  4. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34
  5. [LG]suppression dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 9
    Dernier message: 16/12/2003, 21h20

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