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 :

utilisation pointeurs et structures


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Points : 11
    Points
    11
    Par défaut utilisation pointeurs et structures
    Bonjour,

    Voila plusieurs fois que j'écris des fonctions qui mènent au plantage peu de temps APRES leur execution (pas directement pendant l'exécution des lignes suspectées). Pour l'exemple suivant, j'obtiens le message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *** glibc detected *** escargot: corrupted double-linked list: 0x00024010 ***
    Ci après, un extrait de mon programme.
    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
    int main(int argc, char **argv){
        ...
        TypeJeu Jeu;
        initJeuWithArg(&Jeu, argc, argv);
        ...
    #ifndef PLANTAGE // cas qui est fonctionnel
        sprintf(msg, DEFAULT_DISPLAY_MSG);
        char tmp2=strlen(msg);
        Jeu.pMessageAttente=malloc(sizeof(char)*(tmp2+1));
        strcpy(Jeu.pMessageAttente, msg);
    #endif
        ...
    }
     
     
    void initJeuWithArg(TypeJeu* pJeu, int argc, char **argv){
        initJeu(pJeu);
        ...
    }
     
     
     
    void initJeu(TypeJeu* pJeu){
        ...
    #ifdef PLANTAGE // cas qui mène au plantage
        sprintf(msg, DEFAULT_DISPLAY_MSG);
        char tmp=strlen(msg);
        pJeu->pMessageAttente=malloc(sizeof(char)*(tmp+1));
        strcpy(pJeu->pMessageAttente, msg);
    #else
        pJeu->pMessageAttente=NULL;
    #endif
        ...
    }
     
     
    typedef struct
    {
        ...
        char* pMessageAttente;
        ...
    }
    TypeJeu;
    Je suppute une mauvaise utilisation des pointeurs et des malloc, mais j'ai beau chercher je ne vois pas où. Je tombe régulièrement sur le problème lors de l'écriture de nouvelles fonctions, donc il est peut-être temps que j'ouvre les yeux...

    Pouvez-vous m'aider ?

    Salutations,
    Vincent

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Comment est déclaré "msg" ?

    Le code mis en évidence me semble correct. Tu as probablement un écrasement mémoire ailleurs.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Le code mis en évidence me semble correct. Tu as probablement un écrasement mémoire ailleurs.
    Effectivement.

    Il est probable également qu'il s'agisse d'un free() libéré deux fois ou (surtout) d'un pointeur invalide passé à cette même fonction.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Comment est déclaré "msg" ?
    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
    void initJeu(TypeJeu* pJeu){
        char msg[DEFAULT_DISPLAY_NB_CAR+1];
        strcpy(pJeu->langue,"FRA"); // TODO choix de la langue
        pJeu->i2cLedsID=0;
        pJeu->pidSon=0;
        //pJeu->pMessageAttente=NULL;
    #ifdef MALLOC_DANS_INIT_JEU
        sprintf(msg, DEFAULT_DISPLAY_MSG);
        char tmp=strlen(msg);
        pJeu->pMessageAttente=malloc(sizeof(char)*(tmp+1));
        strcpy(pJeu->pMessageAttente, msg);
    #else
        pJeu->pMessageAttente=NULL;
    #endif
        pJeu->dureeAff=DEFAULT_DISPLAY_PERIOD;
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define DEFAULT_DISPLAY_MSG "?"
    #define DEFAULT_DISPLAY_NB_CAR 1

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Il est probable également qu'il s'agisse d'un free() libéré deux fois
    Cela m'étonnerai que ça vienne d'en dehors de la fonction car l'autre version (sans fonction) est fonctionnelle.

    Citation Envoyé par Obsidian Voir le message
    ou (surtout) d'un pointeur invalide passé à cette même fonction.
    Que dois-je vérifier par rapport à ça ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Points : 11
    Points
    11
    Par défaut utilisation pointeurs et structures
    Bon j’admets que le problème puisse venir d'ailleurs que la fonction présentée. Dans le cas que j'ai présenté comme posant problème, j'ai ajouté des printf un peu partout et le programme fonctionne. Quand je retire ces derniers à l'aide d'une macro spécifique, ça plante comme auparavant.

    Je suspecte un problème dans l'utilisation de libxml2. Quel outil dois-je utiliser pour voir à quoi correspond l'adresse 0x00024010
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *** glibc detected *** escargot: corrupted double-linked list: 0x00024010 ***
    Par rapport à d'autres traces que j'ai ajouté, le programme plante dans l'appel de xmlXPathEvalExpression().

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Tu peux utiliser valgrind (memcheck) ou dr memory pour traquer ce genre de problèmes.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Aussi, pourquoi utiliser sprintf() là où un strcpy() suffirait?
    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.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Aussi, pourquoi utiliser sprintf() là où un strcpy() suffirait?
    En effet ! il n'y a pas de raison.

    L'utilisation de valgrind me donne du fil à retorde. Ma glibc installée n'est pas non-stripped. Je dois d'abord m'approprier la chaine de compilation du rootfs et du sdk.

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Peux-tu au moins utiliser un debugger, comme gdb, et obtenir l'état de la pile avec bt lorsque ta segfault se produit ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Peux-tu au moins utiliser un debugger, comme gdb, et obtenir l'état de la pile avec bt lorsque ta segfault se produit ?
    Pas de gdb en place.

    Est-ce que vous utilisez openEmbedded ?
    Je n'arrive pas à déployer les packages libxml2 et freetype (lors de l'installation du sdk). Je ne sais pas quel serait l'endroit le plus adapté pour poser des questions là dessus...

    EDIT : Je vais de joie en joie avec la version dylan d'openEmbedded, il n'y a plus de glibc mais musl !
    Et bon ça m'arrange pas trop, certains appels systèmes ne sont plus disponibles

Discussions similaires

  1. Utilisation pointeurs et structures imbriquées
    Par vincenet dans le forum Débuter
    Réponses: 3
    Dernier message: 26/05/2014, 21h03
  2. Réponses: 7
    Dernier message: 08/04/2006, 12h18
  3. Pointeurs et structures...
    Par vinzzzz dans le forum C
    Réponses: 13
    Dernier message: 18/01/2006, 11h37
  4. utilisation d'une structure
    Par charonDZenfer dans le forum C++
    Réponses: 8
    Dernier message: 23/08/2004, 16h21
  5. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 13h19

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