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 Invalid write


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 76
    Par défaut Valgrind Invalid write
    Bonsoir tout le monde,

    je suis entrain de développer un petit programme et je l'ai passé sous valgrind dans le but de voir d'éventuels problèmes.

    J'ai une suite d'erreurs que je ne comprends pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ==5060== Invalid write of size 4
    ==5060==    at 0x1089CB: execute (vm.c:37)
    ==5060==    by 0x108833: main (main.c:47)
    ==5060==  Address 0x4a2923c is 11,164 bytes inside an unallocated block of size 4,184,392 in arena "client"
    je ne peux pas poster le code, il commence à être un peu trop gros.

    Globalement j'alloue une zone mémoire de 4096 octets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *p_stack = calloc(4, 1024)
    (Lorsque j'éxecute j'affiche son addresse de début et de fin j'obtiens ceci : 0x4a25240 - 0x4a29240)

    Sur cette zone mémoire j'y mets un pointeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *sp = stack + 1024 * 4
    L'erreur de valgrind est du à cause de ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    case PUSH:
    	printf("PUSH\n");
    	*(--ps_pr->sp) = ax;
    	printf("%d\n", *(ps_pr->sp));
    	break;
    En regardant l'erreur donné par valgrind je constate qu'il parle de l'adresse 0x4a2923c qui serait dans une zone non allouée. Alors que normalement cette zone est bien allouée (je test bien le retour de mon calloc).
    (De plus je précise que l'execution de mon programme ne recontre aucun problème, enfin jusqu'à présent !)

    Je ne vois pas trop quoi faire.

    En vous remerciant par avance pour d'éventuelles idées,
    Je vous souhaites tout de même de bonnes fêtes de fin d'année !

    Cordialement,
    Reverse_

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Les arguments de ton appel à calloc sont intervertis. Que c'en soit la cause serait surprenant (quoique, je ne me suis pas penché sur le comportement de l'allocateur virtuel de valgrind) mais c'est tout de même quelque chose à corriger.

    Je penche pour un comportement indéfini provoqué par une erreur ailleurs dans ton programme, mais difficile de spéculer plus avant sans avoir un exemple minimal sous la main..

  3. #3
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 76
    Par défaut
    Bonjour,

    tout d'abord merci pour ta réponse.

    j'ai essayé de reproduire l'erreur sur un code minimal que voici :

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
    	int *p_stack = calloc(1024, 4);
    	int *sp = NULL;
    	int ax = 10;
     
    	if(p_stack)
    	{
    		sp = (p_stack + (4*1024));
     
    		*(--sp) = ax;
     
    		free(p_stack);
     
    		return 0;
    	}
     
    	return -1;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ==8340== Invalid write of size 4
    ==8340==    at 0x1086D5: main (in /home/lucas/Bureau/a.out)
    ==8340==  Address 0x51de03c is 12,220 bytes inside an unallocated block of size 4,190,048 in arena "client"
    encore merci,
    Cordialement,
    Reverse_

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 127
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Je vais faire une supposition.

    Ce code :
    Il se déplace de 4*1024 ou 4*1024*sizeof(int), car en effet, le pointeur est un pointeur sur un entier et donc le déplacement se fait 4 par 4 (chose que l'on voit avec --sp). Je suspecte que pour que cette opération fonctionne comme convenu, il faudrait transtyper en 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 confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 76
    Par défaut
    Bonjour,

    Oui c'est ça ! Je l'avais oublié cette arithmétique des pointeurs !
    Merci beaucoup !

  6. #6
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonjour,
    problème est résolu
    à bientôt

  7. #7
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 76
    Par défaut
    Bonjour @sambia39,

    merci de t'intéresser à ce problème.

    Sauf si ce je me trompe, ici j'alloue 4096 octets dans le tas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *p_stack = calloc(1024, 4);
    ici (et ceux grâce au transtypage) je pointe sur la dernière adresse allouée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sp = (int *)((char *)(p_stack) + (4*1024));
    Et du coup quand j'écris à cette adresse ;

    je suis bien entre p_stack et p_stack + 4096, du coup je suis bien dans ma zone mémoire allouée non ?

  8. #8
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    +1 Exacte autant pour moi je n'est pas fait attentions au préfixage de le variable pointeur *(--sp) et a mon habitude, je me suis emballée.

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

Discussions similaires

  1. invalid read & write dans une fonction
    Par nocta dans le forum C
    Réponses: 3
    Dernier message: 09/11/2010, 14h22
  2. Valgrind : invalid read of size
    Par YuGiOhJCJ dans le forum C
    Réponses: 4
    Dernier message: 09/07/2010, 18h41
  3. probleme avec valgrind
    Par bloops dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 26/11/2003, 22h49
  4. write() dans une socket.. unix
    Par slack dans le forum Réseau
    Réponses: 5
    Dernier message: 18/12/2002, 20h42
  5. [XMLRAD] invalid character type
    Par Sylvain James dans le forum XMLRAD
    Réponses: 4
    Dernier message: 10/12/2002, 07h47

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