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 :

Valgrind Conditional jump obscure


Sujet :

C

  1. #1
    Membre du Club Avatar de Waether
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 44
    Points : 69
    Points
    69
    Par défaut Valgrind Conditional jump obscure
    Bonjour à tous et merci d'avance

    J'ai un lèger problème avec une de mes fonctions qui produit des erreurs valgrind mais n'empêche pas le bon fonctionnement du programme.
    Une de me fonctions qui check la présence d'un binaire dans les dossiers de la variable PATH de l'environnement et à priori je doit mal utiliser les fonctions systèmes.

    Je ne demande pas que l'on me résoude le problème en me donnant la réponse ce ne serait pas intéressant ne serait-ce que pour l'apprentissage.
    Si vous avez des pistes ou de la doc vers laquelle me rediger je suis preneur par contre.

    Je compile avec -g et avec la commande valgrind suivante j'obtiens cette érreur.

    valgrind --track-origins=yes ./prog-dbg
    ==7816== Conditional jump or move depends on uninitialised value(s)
    ==7816== at 0x400F6E: my_access (get_path.c:48)
    ==7816== by 0x400EA5: get_path (get_path.c:28)
    ==7816== by 0x400B39: execute (execute.c:25)
    ==7816== by 0x4012FC: launch (launch.c:27)
    ==7816== by 0x400A32: main (main.c:27)
    ==7816== Uninitialised value was created by a stack allocation
    ==7816== at 0x400F1A: my_access (get_path.c:42)
    Voilà les sources.

    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
     
    // fonction retournant le path associé au binaire (ex: pour ls -> /bin/ls)
    char    *get_path(char *bin, char **ae)
    {
      char  *path;
      char  **tab_path;
      int   i;
     
      i = 0;
      if ((ae[0] != NULL) && (bin != NULL))
        {
          path = my_getenv("PATH=", ae) + 5;
          tab_path = str_to_word_tab(path, ':');
          while (tab_path[i] != NULL)
            {
              // my_strcat concatène les deux chaînes de caractere dans une nouvelle chaîne qu'il alloue
              tab_path[i] = my_strcat(tab_path[i], "/");
              path = my_strcat(tab_path[i], bin);
              if (my_access(path) == 0)
                {
                  free_all("%t", tab_path); // free le tableau
                  return (path);
                }
              i++;
            }
          my_printf("Command not found\n");
          free_all("%t", tab_path); // free le tableau
        }
      return (NULL);
    }
     
    // ici le but est de tester la présence du binaire donné par la variable path
    int     my_access(char *path)
    {
      struct stat sb;
     
      if (path == NULL)
        return (-1);
      stat(path, &sb);
      if ((sb.st_mode & S_IFDIR) == S_IFDIR)
        return (-1);
      if (access(path, X_OK) == -1)
        return (-1);
      return (0);
    }
    A priori le problème viendrai des lignes suivantes qui quand ont les enlève ne pètent plus de Conditional Jump:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ((sb.st_mode & S_IFDIR) == S_IFDIR)
        return (-1);
    Keep calm and debug ...

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Une méthode pour enlever l'erreur serait d'initialiser sb à 0, lors de la déclaration.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre du Club Avatar de Waether
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 44
    Points : 69
    Points
    69
    Par défaut
    J'ai fait quelques modifs pour set à 0 sb avant tout.

    Avec quelque chose dans ce genre l'érreur ne disparais pas.
    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
    int     my_access(char *path)
    {
      struct stat *sb;
     
      if ((sb = malloc(sizeof(*sb))) == NULL)
        return (-1);
      if (path == NULL)
        return (-1);
      stat(path, sb);
      if ((sb->st_mode & S_IFDIR) == S_IFDIR)
        return (-1);
      if (access(path, X_OK) == -1)
        return (-1);
      free(sb);
      return (0);
    }
    Pareil si je ne malloc pas le pointeur et que je le set à NULL.

    Donc en soit c'est pas très grave ça ne gène pas le fonctionnement du programme je vais plutôt me concentrer sur la suite.
    Merci du coup de main LittleWhite c'est sympa.
    Keep calm and debug ...

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    L'utilisation d'un pointeur, c'est je pense, une ânerie (sans méchanceté). Le mieux est de ne pas en faire.
    Non, je pensais plus à un code comme ça :
    ou au pire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct stat sb;
    memset((void*)&sb, 0, sizeof(sb));
    Autre conseil : le path, devrait être passé en const char*.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre du Club Avatar de Waether
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 44
    Points : 69
    Points
    69
    Par défaut
    Pas de problème si une idée est idiote autant le dire =)

    Donc la première solution a suffie à calmer les deux cent Conditional jump de valgrind et je peux enfin voir les autres erreurs ^^

    J'ai été man du coté de "const" et ça va ben me servir à l'avenir pour éviter les Segfault.

    Du coup problème résolu un grand merci à toi LittleWhite !
    Keep calm and debug ...

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

Discussions similaires

  1. strtok_r: Conditional jump or move depends on uninitialised value
    Par ikuzar dans le forum Bibliothèque standard
    Réponses: 2
    Dernier message: 19/03/2013, 15h36
  2. Réponses: 8
    Dernier message: 17/05/2010, 11h34
  3. probleme avec valgrind
    Par bloops dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 26/11/2003, 22h49
  4. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 11h48
  5. Forcer jump short ou far
    Par Blustuff dans le forum Assembleur
    Réponses: 6
    Dernier message: 02/03/2003, 02h03

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