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 :

Comment vérifier si un pointeur pointe vers une zone allouée?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    Développeur J2EE Senior
    Inscrit en
    Mai 2008
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur J2EE Senior
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 419
    Par défaut Comment vérifier si un pointeur pointe vers une zone allouée?
    Bonjour à tous.


    On m'a refilé un programme écrit par un collègue il y a plusieurs années. A la base il a été écrit sous AIX, donc j'étais censé simplement le recompiler et le faire marcher sous Debian. Mais j'ai des erreurs en pagailles, apparemment le programme est archi buggé, je n'arrive pas à comprendre qu'il ait pu marcher plusieurs années. De plus le code est écrit sous la forme de deux fichiers de 800 lignes chacun, avec des fonctions qui font 4 pages, et quasiment aucun commentaire, la grosse galère, quoi.


    N'ayant pas d'autre choix, je me suis plongé dans l'analyse de ce programme, et j'ai commencé à traquer les erreurs de segmentation. Il apparait que ces erreurs interviennent systématiquement pendant ou immédiatement après l'appel de la fonction chargée de libérer la mémoire allouée. Et je rencontre notamment des erreurs liées à des double-free(), dont je ne comprend pas trop d'où ils sortent. D'où ma question :


    Est-il possible de vérifier si un pointeur pointe vers une zone allouée?


    parce que je mettrais bien en place un test du type
    si (mémoire déjà libérée)
    ne rien faire
    sinon
    libérer la mémoire

    merci.
    Mes cours sur l'écosystème Java EE - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Bonjour,

    en général il conseillé de mettre ton pointeur a NULL lorsque tu le desalloues, comme ca pas de probleme.
    free( NULL ); ca fait pas grand chose (rien meme et c'est garanti par la norme ) et pis c'est facile a tester.

    Sinon parfois un plantage sur le free c'est qu'il y a eu debordement de memoire.

  3. #3
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    si le programme est compilé avec l'option -g, tu peux utiliser valgrind.

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur J2EE Senior
    Inscrit en
    Mai 2008
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur J2EE Senior
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 419
    Par défaut
    @ BainE

    merci beaucoup, c'est ce que je fais toujours, mais l'ennui vient de la complexité du programme. Certaines instructions conditionnelles bougent les pointeurs, et parfois il manque un else, du coup il y a des variables mal initialisées qui sont parfois désalouées, ce genre de chose.. Et je n'ai pas encore relu tout le programme!


    @ nicolas.sitbon

    J'utilise gdb. Mais parfois il me retourne des choses pas exploitable (genre que l'erreur se serait produite dans la librairie libc6 de linux). C'est mieux valgrind?





    Sinon ce que j'aurais pensé faire, c'est faire un realloc : Je prend le pointeur, je le réalloue plus grand que ce qu'il n'a jamais pu être, et je le libère de suite, vous penser que ça pourrait faire quelque chose de propre?
    Mes cours sur l'écosystème Java EE - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Aldian Voir le message
    @ nicolas.sitbon

    J'utilise gdb. Mais parfois il me retourne des choses pas exploitable (genre que l'erreur se serait produite dans la librairie libc6 de linux). C'est mieux valgrind?
    valgrind est tout indiqué dans ton cas!

  6. #6
    Membre chevronné

    Homme Profil pro
    Développeur J2EE Senior
    Inscrit en
    Mai 2008
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur J2EE Senior
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 419
    Par défaut
    Bon j'ai installé Valgrind.

    Mais comme je ne suis pas root, j'ai spécifié un répertoire d'installation différent, à savoir /home/aldian/valgrind. Le programme s'est installé, c'est génial


    Mais impossible de le lancer, très probablement parce que je n'ai pas exporté ce qu'il fallait dans le PATH. Et la question est : mais quoi?

    merci
    Mes cours sur l'écosystème Java EE - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre chevronné

    Homme Profil pro
    Développeur J2EE Senior
    Inscrit en
    Mai 2008
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur J2EE Senior
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 419
    Par défaut
    Bon finalement ce n'était pas bien sorcier donc j'ai fini par trouver.

    Il suffisait d'éditer le fichier .bashrc et d'ajouter la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export PATH=/home/aldian/valgrind/bin:$PATH
    Entre temps, j'ai fini par trouver un else manquant et à comprendre ses implications, ce qui m'a sorti de mon erreur introuvable, et gdb a trouvé les erreurs sans problème. J'ai tout de même lancé valgrind dessus et il me retourne un résultat des plus sympathiques (sauf erreur de ma part):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ==32344== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 13 from 1)
    ==32344== malloc/free: in use at exit: 0 bytes in 0 blocks.
    ==32344== malloc/free: 1 allocs, 1 frees, 352 bytes allocated.
    ==32344== For counts of detected errors, rerun with: -v
    ==32344== All heap blocks were freed -- no leaks are possible.
    Mon problème est résolu, merci à vous.

    PS si quelqu'un a tout de même une réponse à :
    Sinon ce que j'aurais pensé faire, c'est faire un realloc : Je prend le pointeur, je le réalloue plus grand que ce qu'il n'a jamais pu être, et je le libère de suite, vous penser que ça pourrait faire quelque chose de propre?
    Ca m'intéresserait bien quand même (pour ma culture)
    Mes cours sur l'écosystème Java EE - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/03/2010, 08h16
  2. Réponses: 4
    Dernier message: 23/12/2009, 12h26
  3. bouton qui pointe vers une page jsp
    Par redabadache3 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 29/10/2007, 14h33
  4. Réponses: 0
    Dernier message: 15/08/2007, 16h36
  5. Réponses: 11
    Dernier message: 24/07/2003, 09h24

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