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]Probleme de malloc detecté et fuites memoire (petite précision le projet fonctionne )


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 17
    Par défaut [Valgrind]Probleme de malloc detecté et fuites memoire (petite précision le projet fonctionne )
    bonjour ,
    j'ai vraiment besoin d'aide, je ne m'en sort pas avec mon projet
    avez vous une idée du probleme ?

    ==4941== Invalid write of size 1
    ==4941== at 0x4026107: strcpy (mc_replace_strmem.c:311)
    ==4941== by 0x804B8B0: ruleFromString (regle.c:129) / ligne 16 dans le past
    ==4941== by 0x804EADC: loadRuleBase (persistance.c:212)
    ==4941== by 0x80492ED: morpionGame (morpion.c:150)
    ==4941== by 0x804EEAB: main (main.c:37)
    ==4941== Address 0x46d9842 is 7 bytes after a block of size 3 alloc'd
    ==4941== at 0x4024F20: malloc (vg_replace_malloc.c:236)
    ==4941== by 0x804B87F: ruleFromString (regle.c:126)
    ==4941== by 0x804EADC: loadRuleBase (persistance.c:212)
    ==4941== by 0x80492ED: morpionGame (morpion.c:150)
    ==4941== by 0x804EEAB: main (main.c:37)
    ==4941==
    ==4941== Invalid read of size 1
    ==4941== at 0x402665C: strcmp (mc_replace_strmem.c:426)
    ==4941== by 0x804D556: moteurInfAR (moteur.c:108) // LIGNE 13 dans le past
    ==4941== by 0x8049950: morpionGame (morpion.c:269)
    ==4941== by 0x804EEAB: main (main.c:37)
    ==4941== Address 0x46d983b is 0 bytes after a block of size 3 alloc'd
    ==4941== at 0x4024F20: malloc (vg_replace_malloc.c:236)
    ==4941== by 0x804B87F: ruleFromString (regle.c:126)
    ==4941== by 0x804EADC: loadRuleBase (persistance.c:212)
    ==4941== by 0x80492ED: morpionGame (morpion.c:150)
    ==4941== by 0x804EEAB: main (main.c:37)
    ==4941==
    ==4941== Invalid read of size 1
    ==4941== at 0x402665C: strcmp (mc_replace_strmem.c:426)
    ==4941== by 0x804D556: moteurInfAR (moteur.c:108)
    ==4941== by 0x8049979: morpionGame (morpion.c:270)
    ==4941== by 0x804EEAB: main (main.c:37)
    ==4941== Address 0x46d983b is 0 bytes after a block of size 3 alloc'd
    ==4941== at 0x4024F20: malloc (vg_replace_malloc.c:236)
    ==4941== by 0x804B87F: ruleFromString (regle.c:126)
    ==4941== by 0x804EADC: loadRuleBase (persistance.c:212)
    ==4941== by 0x80492ED: morpionGame (morpion.c:150)
    ==4941== by 0x804EEAB: main (main.c:37)
    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
    short ruleFromString( char* ruleString,Rule* r) {
        char* token = NULL; // Partie de string
        char* hypo = NULL;
        short length;
     
        listInit(&(r->hypo));
        token = strtok(ruleString, " ");
     
        //parcours des hypotheses
        while (token != NULL) {
            length = sizeof(char) * (strlen(token)+1);
            if(strcmp(token,"->")==0) { // Test : fin des hypothèses
                token = strtok(NULL," "); // NULL : prend la derniere chaine de caractères stockée
                if(token==NULL)
                    return -1;
                r->concl = malloc((length)); // pb detecte avec valgrind
                if(r->concl == NULL) // Test du malloc
                    return -1;
                strcpy(r->concl,token); // pb detecte avec valgrind
                return 1;
            }
            hypo = malloc(length);
            strcpy(hypo, token);
            if(!listPushBack(&(r->hypo),(void*) hypo)) { // Test fonctionnement de listPushBack ?
                listRemoveAll(&(r->hypo)); // Suppression de toutes les hypothèses
                return -1;
            }
            token = strtok(NULL," ");
        }
        return 1;
    }
    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
    short moteurInfAR(List listRules, List listFacts,char *but) {
     
        Rule *rule = NULL;
        char *hypo = NULL;
        short flag_allHypoFound = 0;
        int i = 0;
        int j = 0;
     
        if(elementSearch(listFacts,but) == 1) // Si but est dans les faits
            return 1;
        for (i = 0; i < listLength(listRules); i++) { // Parcours de la liste de règles
                rule = (Rule *) listGetElement(listRules, i);
                if (strcmp (but,rule->concl)== 0) { // Si le but est la conclusion d'une des règles
                    flag_allHypoFound = 1;
                    for (j = 0; j < listLength(rule->hypo); j++) { // Parcours des hypothèses d'une règle
                        hypo = (char*) listGetElement(rule->hypo, j);
                        if (elementSearch(listFacts, hypo) == 0)//  Si une hypo n'est pas dans la base de faits ,flag_allHypoFound = 0
                            flag_allHypoFound = 0;
                    }
                    if(flag_allHypoFound) // Si un but est verifié , arrêt du parcourt de la liste regles
                        break;
                }
                else
                    flag_allHypoFound = 0;
        }
        return flag_allHypoFound;
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 29
    Par défaut
    Bonjour,
    j'ai très souvent eu ce genre de problème, et en général je l'ai résolu en passant le malloc (strlen(string)+1) a malloc(strlen(string+2)).
    Les invalide read et write surviennent en effet lors de malloc trop petit.
    En espérant que cela puisse vous aider.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 17
    Par défaut
    Citation Envoyé par Arofu Voir le message
    Bonjour,
    j'ai très souvent eu ce genre de problème, et en général je l'ai résolu en passant le malloc (strlen(string)+1) a malloc(strlen(string+2)).
    Les invalide read et write surviennent en effet lors de malloc trop petit.
    En espérant que cela puisse vous aider.
    malloc(strlen(string+2)). ou malloc(strlen(string)+2). ???

    j'ai tenté les deux solutions , je n'ai pas d'ameliorations

    merci tout de meme !

    deja dans la fonction moteurarinf il manque le malloc de rule .
    ou faut t'il ajouter le malloc et le free pour char *rule??

    (je precise je debute )

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 17
    Par défaut
    ajout de quelques informations

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    listFacts est une liste de char
    listRules est une liste de struct rule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct node {
    	void* data;
    	struct node* suiv;
    } Node;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct rule {
        List hypo;
        char* concl;
     
    } Rule;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Rule* ruleCreate() {
        Rule* newRule = malloc(sizeof(Rule));
        if(newRule != NULL) { //Test du malloc
        	newRule->concl = NULL; // Initialisation de la conclusion
        	listInit(&(newRule->hypo)); // Initialisation de la liste d'hypothèses
        }
        else
        	return NULL;
     
        return newRule;
    }

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 29
    Par défaut
    Pardon, je voulais bien dire malloc(strlen(string)+2) comme vous le pensiez.
    Vous parlez d'un char *rule sans malloc dans la fonction moteurarinf, pouvez vous nous montrer le code, nous voyons ici un Rule *rule dans la fonction moteurInfAR.

    Par ailleur, pour quelle raisons en êtes vous arrivé a valgrind, cela causait il un soucis sérieux dans le fonctionnement du programme ?

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 17
    Par défaut
    Citation Envoyé par Arofu Voir le message
    Pardon, je voulais bien dire malloc(strlen(string)+2) comme vous le pensiez.
    Vous parlez d'un char *rule sans malloc dans la fonction moteurarinf, pouvez vous nous montrer le code, nous voyons ici un Rule *rule dans la fonction moteurInfAR.

    Par ailleur, pour quelle raisons en êtes vous arrivé a valgrind, cela causait il un soucis sérieux dans le fonctionnement du programme ?

    je parlé de moteurInfAR. ( mauvaise syntaxe)
    mon programme ( un morpion) consomme plusieur MO de ram par minutes
    et ne les rend pas , valgrind c'etait pour detecter les fuite memoires et j'ai decouvent sa .

    a part sa le programme marche parfaitement .

Discussions similaires

  1. Probleme de malloc détecté par valgrind
    Par photonman dans le forum Débuter
    Réponses: 10
    Dernier message: 06/05/2008, 14h54
  2. Autre que valgrind pour les fuites memoire
    Par yupa dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 30/01/2008, 22h23
  3. Dll et detection de fuite de memoire
    Par Nicolas Bauland dans le forum Visual C++
    Réponses: 3
    Dernier message: 06/08/2007, 22h31
  4. [VC++6] probleme fuite memoire CLIST ?
    Par athilla dans le forum MFC
    Réponses: 16
    Dernier message: 22/11/2005, 16h01
  5. Problème de détection de la mémoire
    Par _Froggy_ dans le forum Administration système
    Réponses: 3
    Dernier message: 26/04/2005, 20h42

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