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 :

Surcharge des fonctions malloc et free


Sujet :

C

  1. #1
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut Surcharge des fonctions malloc et free
    Bonjour,

    Afin de détecter les fuites de mémoire, j'ai surchargé les fonctions malloc et free. Pas de soucis à ce niveau.
    Maintenant j'ai plusieurs programmes avec les sources que je veux tester.
    Pour cela je dois manuellement ajouter deux fichiers (un .c et un.h) ainsi que les 3 directives suivantes (tout en haut de chaque fichier .c) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "checkMemory.h"
    #define malloc(sz) check_malloc((sz), __FILE__, __LINE__)
    #define free(sz) check_free((sz), __FILE__, __LINE__)
    Je cherche à savoir si il est possible d'ajouter ces trois directives automatiquement à chacun de mes fichiers sources (dans un projet, j'ai une dizaines de fichiers sources).

    J'utilise mingw32 comme compilateur sous windows 7.

    Merci beaucoup
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonjour

    Pourquoi ne pas avoir ajouté les #define sur malloc et free dans checkMemory.h ?
    Sinon pour rajouter la ligne #include autant éditer les 10 fichiers à la main c'est presque plus rapide que de le faire avec un script du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cat << EOF > header
    #include "memoryCheck.h"
    #define ...
    #define ...
    EOF
    for file in la liste des fichiers sources sans doute un *.c; do
      cp $file $file.bkp
      cat header $file.bkp > $file
    done
    C'est quick and dirty pas à l'épreuve de tous les cas de figure etc ...
    Il doit y avoir un équivalent en powershell pas trop compliqué à construire je suppose, avec des foreach et des add-content, mais je ne suis pas un pro.

    Sinon ... pourquoi ne pas utiliser valgrind ?

  3. #3
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Bonjour,

    Je ne peux pas mettre les deux defines dans checkmemory.h car dans checkmemory.c j'appelle les vraies fonctions malloc et free donc je ne dois pas les overloader...

    (sauf si j'ai raté quelque chose...)

    Et sinon pour le #include, oui faire un script j'y ai pensé mais je voulais savoir s'il n'y avait pas une autre méthode.

    Et pour valgrind, c'est super cool comme outil mais ne marche que sous Linux et je travaille sous Windows
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  4. #4
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    mingw32 + W7, pas sûr que valgrind fonctionne dessus...
    Tu peux utiliser Dr.Memory dessus, c'est ce que je fais et le rendu est similaire...

    L'appel à Dr.Memory se fait exactement comme Valgrind :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -g -G3 -ggdb
    drmemory -show_reachable -leak_check
    (au lieu de --show-reachable=yes --leak-check=full)

    Mais je ne peux que plussoyer kwariz : un coup de valgrind sur un linux sera toujours très utile !
    J'ai eu des comportements très différents entre mingw32, cygwin et linux !
    Mingw32 segfault beaucoup moins que Linux ou Cygwin, et tolère des dépassements légers de la mémoire....
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Citation Envoyé par Aspic Voir le message
    Bonjour,

    Je ne peux pas mettre les deux defines dans checkmemory.h car dans checkmemory.c j'appelle les vraies fonctions malloc et free donc je ne dois pas les overloader...

    (sauf si j'ai raté quelque chose...)
    Bah si tu les mets tout à la fin il n'y aura pas de problème. Un #define n'a d'effets qu'après sa définition jamais avant, c'est juste une directive du préprocesseur.

    Ah oui .... pas de valgrind sous win32 ... je ne connais pas l'outil proposé par metalman mais bon il fleure bon

  6. #6
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par kwariz Voir le message
    Bah si tu les mets tout à la fin il n'y aura pas de problème. Un #define n'a d'effets qu'après sa définition jamais avant, c'est juste une directive du préprocesseur.
    Tu as raison, je suis bête c'est l'habitude de mettre les defines dans le .h j'ai oublié qu'on pouvais aussi les mettre dans les fichiers sources

    Merci pour ton aide, pour le include qui reste, je le ferais en script

    EDIT : mince ca marche pas à la fin des fichiers .c les #define ne sont pas pris en compte...
    Et si je les mets à la fin du .h alors les fonctions malloc et free du fichier .c sont overloadées et donc je suis en boucle infinie
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  7. #7
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Mets tout dans le header et pour forcer l'appel à la fonction malloc plutôt qu'à la macro il te suffit de mettre malloc entre parenthèse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void* xmalloc(size_t size, size_t line, const char* source)
    {
      fprintf(stderr, "malloc size : %lu in %s line %lu\n", size, source, line);
      return (malloc)(size);
    }

  8. #8
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Je peux pas tester maintenant mais merci beaucoup pour l'astuce, je ne connaissait pas du tout
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

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

Discussions similaires

  1. Surcharge des fonctions d'une classe (wrapping)
    Par RapotOR dans le forum C++
    Réponses: 3
    Dernier message: 23/10/2013, 17h43
  2. Utilisation des fonctions malloc() et free()
    Par m.badji dans le forum Débuter
    Réponses: 3
    Dernier message: 23/02/2013, 13h04
  3. Question sur la fonction malloc et free
    Par yann458 dans le forum Débuter
    Réponses: 4
    Dernier message: 27/05/2012, 09h21
  4. Surcharge des fonctions
    Par nassu dans le forum C++
    Réponses: 11
    Dernier message: 06/05/2009, 13h20
  5. [MFC] Surcharger des fonctions de CView
    Par Philippe320 dans le forum MFC
    Réponses: 2
    Dernier message: 22/11/2005, 21h24

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