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 me démoralise un peu


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 70
    Par défaut Valgrind me démoralise un peu
    Bonjour tout le monde,

    Suite à une erreur que je n'arrive pas à traquer, je suis aller voir pour utiliser d'autre méthode de recherche, et je suis tomber sur valgrind.

    Le problème, c'est que si je comprend bien, j'ai des erreurs partout dans mon code ... Par exemple il me pointe ce petit bout de code la :

    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
     
    void em_string_check (em_string_t * string, unsigned int newSize)
    {
    	if ( string->size == 0 )
    	{
    		string->ptr = em_malloc(newSize * sizeof(char));
    	}
    	else if ( string->size < newSize)
    	{
    		string->ptr = em_realloc(string->ptr, newSize * sizeof(char));
    	}
     
    	string->size = newSize;
    	string->ptr[newSize] = '\0';
    }
    Il m'écrit "Invalid write of size 1" en ce qui concerne la ligne : string->ptr[newSize] = '\0';
    Et je ne comprend pas bien pourquoi ? Il faut savoir que ma mes fonctions em_malloc() et em_realloc() s'occupe de flinguer le programme si l'allocation a foiré.

    Il m'écrit le même genre d'alerte avec un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ( strcmp(test, "un_mot") == 0 )
    {
        // ...
    }
    D'après ce que je comprend, on aime pas que les blocs soient écrit en dur avec valgrind ??

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Si tes em_malloc() et em_realloc() fonctionne comme malloc() et realloc(), alors effectivement il y a une écriture invalide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ....
    		string->ptr = em_malloc(newSize * sizeof(char));
    ....
    		string->ptr = em_realloc(string->ptr, newSize * sizeof(char));
    ....
    	string->ptr[newSize] = '\0';
    Les indices de string->ptr doivent être entre 0 et newSize -1 inclus.

    Pour l'autre diagnostic, on manque d'informations

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 70
    Par défaut
    Ah oui juste !

    Effectivement pour ma fonction, je donne une taille dans laquelle je compte la fin de chaine.
    Donc je dois faire newsize-1. Un peu distrait...

    Je pense même avoir mon problème de base. Merci.

    Je vais quand même revoir pour strcmp()...

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 70
    Par défaut
    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
     
    em_string_t * em_parser_getGenericValue (em_vars_t * vars, const char * section, const char * var)
    {
    	unsigned int i;
     
    	if ( section == NULL || var == NULL )
    		return NULL;
     
    	for ( i = 0; i < vars->sectionsCount; i++ )
    	{
    		if ( strcmp(section, vars->sections[i].name.ptr) == 0 )
    		{
    			unsigned int j;
     
    			for ( j = 0; vars->sections[i].varsCount; j++ )
    			{
    				if ( strcmp(var, vars->sections[i].vars[j].name.ptr) == 0 )
    					return &vars->sections[i].vars[j].value;
    			}
    		}
    	}
     
    	em_trace(_MSG_ERROR, "The var %s in %s section doesn't exists !", var, section);
     
    	return NULL;
    }
    voila ce que m'écrit valgring a propos de mon utilisation de strcmp()

    ==3976== Use of uninitialised value of size 8
    ==3976== at 0x5427578: __strcmp_ssse3 (strcmp.S:2070)
    ==3976== by 0x40276C: em_parser_getGenericValue (em_lib3_parser.c:374)
    ==3976== by 0x4028BB: em_parser_getBoolean (em_lib3_parser.c:405)
    ==3976== by 0x402D4C: em_configure (em_p_base.c:38)
    ==3976== by 0x402DF3: emeraude_start (em_p_base.c:62)
    ==3976== by 0x402EA9: main (em_p_entrypoint.c:10)

    Donc en fait j'ai une structure et dedans je vais chercher dans la section un tel, la variable un tel. Voila, là je comprend pas ce que je fais de mal ? Certainement un truc qui ne me saute pas aux yeux... lol

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Il y a une erreur dans le second for :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ( j = 0; vars->sections[i].varsCount; j++ )
    Ici la condition de continuation est toujours vrai, tu as donc une boucle infinie et tu accédes en dehors de tes éléments. A priori le for devrait plutôt être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ( j = 0; j < vars->sections[i].varsCount; j++ )

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 70
    Par défaut
    mmm ... Je me sens un peu biesse là.

    Mais a force de lire mon code, je vois plus rien lol.

    Merci beaucoup.

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

Discussions similaires

  1. probleme avec valgrind
    Par bloops dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 26/11/2003, 22h49
  2. je m'y perd un peu dans tous ces plugin
    Par Stessy dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 30/09/2003, 23h33
  3. RTL60 ( la jsuis un peu confused)
    Par magdoz dans le forum Outils
    Réponses: 7
    Dernier message: 23/07/2002, 11h20
  4. DirectX 6, un peu en retard ... :\
    Par multani dans le forum DirectX
    Réponses: 3
    Dernier message: 28/05/2002, 19h19

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