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 et malloc() ?


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Par défaut valgrind et malloc() ?
    Bonjour,

    Voila je fais un petit code sur les raw sockets et voila , a la compilation , tous va bien seulement sa ne plait pas a valgrind qui me detecte quelque chose que je ne comprend pas !

    ==8180== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
    ==8180== at 0x4000792: (within /lib/ld-2.3.6.so)
    ==8180== by 0x8049133: fn_thread_scan (in /home/marnage/s)
    ==8180== by 0x402E23F: start_thread (in /lib/tls/i686/cmov/libpthread-2.3.6.so)
    ==8180== by 0x410749D: clone (in /lib/tls/i686/cmov/libc-2.3.6.so)
    ==8180== Address 0x416E958 is 32 bytes inside a block of size 40 alloc'd
    ==8180== at 0x401C38B: malloc (vg_replace_malloc.c:149)
    ==8180== by 0x8049A04: init_struct (in /home/marnage/s)
    ==8180== by 0x804918A: scan_port (in /home/marnage/s)
    ==8180== by 0x8049133: fn_thread_scan (in /home/marnage/s)
    ==8180== by 0x402E23F: start_thread (in /lib/tls/i686/cmov/libpthread-2.3.6.so)
    ==8180== by 0x410749D: clone (in /lib/tls/i686/cmov/libc-2.3.6.so)
    Donc ont peut voir
    ==8180== at 0x401C38B: malloc (vg_replace_malloc.c:149)
    ==8180== by 0x8049A04: init_struct (in /home/marnage/s)

    Je dois comprendre qu'un malloc() dans cette fonction n'et pas bon?
    Voila la fonction :

    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
    init_struct(packet_t **packet)
    {
    	*packet = NULL;
     
    	*packet = (packet_t *) malloc(sizeof(packet_t));
    	if ( *packet == NULL ) {
    		fprintf(stderr, "malloc() on packet failed\n");
    		return -1;
    	}
     
    	(*packet)->tcp = NULL;
    	(*packet)->ip = NULL;
    	(*packet)->fakehdr = NULL;
    	(*packet)->pkt_send = NULL;
    	(*packet)->pkt_recv = NULL;
     
    	(*packet)->pkt_send = (char *) malloc(LEN_PACKET);
    	if ( (*packet)->pkt_send == NULL ) {
    		fprintf(stderr, "malloc() on pkt_send failed\n");
    		return -1;
    	}
     
    	(*packet)->ip = (iphdr_t *) (*packet)->pkt_send;
    	if ( (*packet)->ip == NULL ) {
    		fprintf(stderr, "ip value error\n");
    		return -1;
    	}
     
    	(*packet)->tcp = (tcphdr_t *) ((*packet)->pkt_send + sizeof(iphdr_t));
    	if ( (*packet)->tcp == NULL ) {
    		fprintf(stderr, "ip value error\n");
    		return -1;
    	}
     
    	(*packet)->fakehdr = (fakehdr_t *) malloc(sizeof(fakehdr_t));
    	if ( (*packet)->fakehdr == NULL ) {
    		fprintf(stderr, "malloc() on fakehdr failed\n");
    		return -1;
    	}
     
    	return 0;
    }
    Personellement je ne vois pas se que valgrind lui trouve ... si quelqu'un aurait une piste ...

    Voici la fonction sendto() a tout hasard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	if ( sendto(sock->s, packet->pkt_send, LEN_PACKET, 0, (struct sockaddr *)&sock->to, sizeof(sock->to)) == -1 )
    Et le paquet une fois envoyer est correcte ... .
    Merci.
    ++

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 449
    Par défaut
    Citation Envoyé par Marnage Voir le message
    Personellement je ne vois pas se que valgrind lui trouve ... si quelqu'un aurait une piste ...
    Merci.
    ++
    Il y a deux messages différents dans ton log de Valgrind, mais avant toute chose, laquelle des lignes que tu nous a montrées est la numéro 149 ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Par défaut
    La ligne 149 de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void*		fn_thread_func(void *argument);

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Par défaut
    Ok ba je marque résolu j'ai trouver le problème .
    Merci encore et dsl pour le flood

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 449
    Par défaut
    Citation Envoyé par Marnage Voir le message
    Ok ba je marque résolu j'ai trouver le problème .
    Merci encore et dsl pour le flood
    Ok, fais-en profiter les autres, maintenant :-)

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Marnage Voir le message
    Personellement je ne vois pas se que valgrind lui trouve ... si quelqu'un aurait une piste ...
    Je ne vois rien d'horrible (à part des cast douteux et non portables), mais passer l'adresse d'un pointeur rend le code inutilement complexe.
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define LEN_PACKET 1024
     
    typedef struct
    {
       int dummy;
    }
    iphdr_t;
     
    typedef struct
    {
       int dummy;
    }
    tcphdr_t;
     
    typedef struct
    {
       int dummy;
    }
    fakehdr_t;
     
    typedef struct
    {
       tcphdr_t *tcp;
       iphdr_t *ip;
       fakehdr_t *fakehdr;
       unsigned char *pkt_send;
       unsigned char *pkt_recv;
    }
    packet_t;
     
    packet_t *init_struct (void)
    {
       packet_t *packet = malloc (sizeof (packet_t));
     
       if (packet != NULL)
       {
          packet->tcp = NULL;
          packet->ip = NULL;
          packet->fakehdr = NULL;
          packet->pkt_recv = NULL;
     
          packet->pkt_send = malloc (LEN_PACKET);
     
          if (packet->pkt_send != NULL)
          {
             packet->ip = (iphdr_t *) packet->pkt_send;
             packet->tcp = (tcphdr_t *) (packet->pkt_send + sizeof (iphdr_t));
     
             packet->fakehdr = malloc (sizeof (fakehdr_t));
             if (packet->fakehdr == NULL)
             {
                fprintf (stderr, "malloc() on fakehdr failed\n");
             }
          }
          else
          {
             fprintf (stderr, "malloc() on pkt_send failed\n");
          }
       }
       else
       {
          fprintf (stderr, "malloc() on packet failed\n");
       }
       return packet;
    }
     
    int main (void)
    {
       packet_t *packet = init_struct ();
     
       return 0;
    }

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Par défaut
    Ok, fais-en profiter les autres, maintenant :-)
    Donc en faite le problème a était regler avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset((*packet)->pkt_send, 0, LEN_PACKET);
    Après avoir allouer l espace mémoire de packet->pkt_send

    @ Emmanuel Delahaye :
    Ton code je le comprend pas vraiment , tu ne donne pas d argument a ta fonction ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    packet_t *init_struct (void)
    Hum je vois un void moi , si tu aurais un tuto qui parle de sa car la je suis largué et utiliser un truc que je comprend pas bof .
    En tous cas merci .

  8. #8
    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
    void (mais pas void*) dans la liste des paramètres d'une fonction signifie que la fonction ne prend pas d'argument.

    Ton code passe l'adresse d'un pointeur dans lequel tu places l'adresse de la mémoire allouée et tu utilises la valeur de retour comme code d'erreur.

    Le code d'Emmanuel renvoie directement l'adresse de la mémoire allouée.
    La gestion d'erreur d'allocation de packet se fait sur cette valeur : erreur si NULL, pas d'erreur sinon.
    La gestion d'erreur (si packet est alloué) sur packet->pkt_send ou sur packet->fakehdr se fait sur la valeur NULL ou non stockée dans ces pointeurs

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 01/09/2011, 09h56
  2. gestion mémoire (valgrind, g_mem_profile, wrapping malloc)
    Par vitoubien dans le forum GTK+ avec C & C++
    Réponses: 17
    Dernier message: 24/08/2009, 17h12
  3. Probleme de malloc détecté par valgrind
    Par photonman dans le forum Débuter
    Réponses: 10
    Dernier message: 06/05/2008, 14h54
  4. Erreur de sgmentation avec malloc
    Par simonm dans le forum C
    Réponses: 5
    Dernier message: 27/02/2003, 08h29
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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