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 :

Free (NULL) ;


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Par défaut Free (NULL) ;
    Salut,

    Je suis entrain de chercher une expliquer pour le phénomène de Hung up (surtout pour les système embarqués).
    pourquoi observe t'on une crash du système en exécutant une instruction
    je suis juste entrain de chercher le scénario pour mieux imaginer la situation!


    merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    "Free", avec ou sans majuscule ?

    Sans majuscule :
    free() libère l'espace mémoire pointé par ptr, qui a été obtenu lors d'un appel antérieur à malloc(), calloc() ou realloc(). Si le pointeur ptr n'a pas été obtenu par l'un de ces appels, ou s'il a déjà été libéré avec free(), le comportement est indéterminé. Si ptr est NULL, aucune tentative de libération n'a lieu.
    "Free" avec majuscule, je ne connais pas.

  3. #3
    Membre chevronné Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Si ptr est NULL, aucune tentative de libération n'a lieu.
    Peut être que certaines librairies (en embarqué) ne collent pas exactement à la norme et que cela peut les crasher.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    En effet, Free() avec majuscule ne fait pas partie de la bibliothèque standard, ni de POSIX.

    En standard, tu as free(NULL) qui ne fait rien et fclose(NULL) qui est un comportement indéfini (en clair, un bug, plante sous Windows).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    J'ai même déjà vu des librairies embarquées où les fonctions d'allocation dynamiques n'existaient tout simplement pas...

    Il faut voir ce que fait ta fonction de libération, mais une chose est sûre : tester la validité du pointeur à libérer coûte un peu de code et de temps CPU. Certes, c'est très faible, mais pour certaines cibles très fortement contraintes à ce niveau, c'est déjà trop.
    Donc, on vire souvent 100% des tests anti-crash pour gagner de la place en mémoire (footprint + consommation RAM), et si tu te plantes dans tes appels, c'est tant pis pour toi.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Enfin, je n'appelle pas free(NULL) "se planter dans les appels" quand c'est une garantie du standard...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Enfin, je n'appelle pas free(NULL) "se planter dans les appels" quand c'est une garantie du standard...
    Encore faut-il que ton compilateur et ta CLib soient standards, ce qui est assez fréquemment un vœu pieux avec les SDK de microcontrôleurs...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et pas seulement avec les biblothèques micro, comme j'ai déjà eu le loisir de le dire... ici-même..

    Mais je me suis fait taper dessus ....



    Encore une fois, je répète : pour faire un vrai code propre, sûr, passant partout, c'est franchement pas compliqué de rajouter un "if ( ptr != NULL )"...

  9. #9
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Par défaut
    okay je suis tout à fait d'accord avec vous seulement je veux comprendre pourquoi le système crash?? je cherche plutôt une explication logique du phénomène.

    et concernant la fonction c

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Donc, un vrai free() en minuscules?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ilyes_dev Voir le message
    okay je suis tout à fait d'accord avec vous seulement je veux comprendre pourquoi le système crash?? je cherche plutôt une explication logique du phénomène.
    tout simplement parce que le test mentionné ci-dessus n'est pas inclus dans la version de ta bibliothèque dans la fonction free...

    Or , à l'intérieur, free met à jour des pointeurs et utilise des fonctions bas niveau..

    La présence d'un pointeur NULL, si non testée à l'entrée, provoquera tout un tas de choses étranges, dont l'accès à une adresse non valide ou une adresse négative, par soustraction...

  12. #12
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Ou pire : sur un microcontrôleur, tenter de marquer comme "libre" l'adresse NULL (donc, zéro) revient à tenter d'écrire dans cette zone mémoire... Qui est bien souvent le vecteur de démarrage du processeur, correspondant donc à de la belle mémoire ... ROM !! Ou Flash, mais ce n'est pas mieux à ce niveau.

    Cela plante donc parce que tu tentes d'écrire dans une mémoire qui ne peut pas l'être. Comme ça peut planter parce que tu soustrais la taille de l'entête de tas, que tu boucles en fin de mémoire sur des zones non accessibles, ou que tu tapes dans des registres importants, bref des infinités de raisons.

    Retiens surtout ceci : ça crashe ? Alors ne le fais pas, et blinde ton code en amont (si tu le peux), ou mieux : vérifie le bug sévère qui t'a mis un pointeur officiellement alloué à NULL sans te prévenir...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    ou mieux : vérifie le bug sévère qui t'a mis un pointeur officiellement alloué à NULL sans te prévenir...
    Sauf que ce n'est pas toujours un bug, et souvent tu es prévenu. Je pense notamment à des structures dont certains membres seraient optionnels. Bien sûr, rajouter le test n'est pas grand-chose, mais ça n'en est pas moins frustrant (pour moi, du moins) quand le standard dit qu'on n'est pas censé avoir besoin de le mettre...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Sauf que ce n'est pas toujours un bug, et souvent tu es prévenu.
    Ben tenter de libérer un pointeur NULL, faut qu'on m'explique où est passé le pointeur initial, pourquoi plusieurs entités peuvent le libérer sans protections, et pourquoi c'est une entité qui ne "possède" plus le bloc qui tente de le libérer...
    Je t'accorde que ce n'est pas toujours un bug : c'est plus souvent une erreur de conception...

    Citation Envoyé par Médinoc Voir le message
    Je pense notamment à des structures dont certains membres seraient optionnels. Bien sûr, rajouter le test n'est pas grand-chose, mais ça n'en est pas moins frustrant (pour moi, du moins) quand le standard dit qu'on n'est pas censé avoir besoin de le mettre...
    D'un autre côté, en embarqué, on a tendance à fuir les "cas particuliers" à l'exécution, et à se taper des tonnes de cas particuliers à l'écriture par contre (notamment non respect des standards)...
    Les structures avec champs optionnels ? Cela existe, dans le principe, sauf qu'en général c'est souvent alloué malgré tout (déterminisme de la consommation mémoire), et rempli de données neutralisant les actions derrière (ex : taille à zéro, chaînes vides, etc.).

    Du coup, si tu dois faire des tests de ce genre, tu as des chances de perdre plus de temps machine (au final) qu'en allouant bourrinement... Ce qui n'est donc pas rentable. D'où inutilité du test (encore un poil de gain), et pas d'appel à free avec un paramètre NULL (encore du gain).

    Je sais, c'est parfois une mentalité bizarre. J'ai mis longtemps à m'habituer à un principe courant qui est qu'un programme ne s'arrête pas, par exemple, ce qui fait que le code d'arrêt "propre" est superflu, coûteux et donc éliminé. Au début, ça m'a fait pas mal hurler d'arrêter un programme à coup de bouton ON/OFF...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    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 122
    Billets dans le blog
    148
    Par défaut
    J'ai parcouru un peu en travers le sujet et je reste assez perplexe.

    Le free(NULL) fonctionne très bien. Je l'utilise surement à outrance .
    Mais sur les machines que j'ai utilisé, je peux cité, ces: Linux / Windows ( classique ) / WinCE6 / uITRON / Symbian (ARMV5)

    uITRON est la machine la plus pénible, est pourtant, ça, ça marche.
    Du coup, je voudrais bien connaitre quel est la machine avec lequel le problème arrive?
    Et aussi, est on archi sur que c'est un free(NULL). Peut être que le pointeur passé n'est pas exactement à NULL. (parce que l'on n'ecrit pas free(NULL) explicitement)
    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.

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    cela dépend des biblios et machines..

    Dans ce que j'avais cité il y a 1 an ou 2, il y avait des serveurs HP (HPUX), des machines Silicon (IRIX) , dans le milieu/fin des années 90 et par exemple Linux redhat au moins jusqu'à 7.3, c'est à dire environ 2002...

    avec gcc..

    et la libc locale...

    Pour ce cas-ci je ne sais pas...

  17. #17
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Mais sur les machines que j'ai utilisé, je peux cité, ces: Linux / Windows ( classique ) / WinCE6 / uITRON / Symbian (ARMV5)
    Ce qui reste encore des plate-formes relativement classiques, à part µITRON que je n'ai jamais rencontré pour l'instant.

    Pour ma part, j'ai déjà eu ce genre de problème sur des CPU 16 bits Fujitsu et Hitachi, sur d'anciens compilateurs embarqués C/C++, sous DOS/Win16, sur des machines Solaris, et sur quelques serveurs *nix de ma fac (c'était peut-être le HP-UX, d'ailleurs).
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  18. #18
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Peut être que le pointeur passé n'est pas exactement à NULL. (parce que l'on n'ecrit pas free(NULL) explicitement)
    Ah ça, par contre, ça peut tuer un programme.

    Ça aussi, d'ailleurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct uneStructure * ps = malloc( sizeof *ps );
    free(&ps->un_champ_qui_nest_pas_le_premier);
    Et ça aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct uneStructure * ps; /*non-initialisé*/
    free(ps);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ah ça, par contre, ça peut tuer un programme.
    Un double free peut faire le même effet parfois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void* machin = malloc(100);
    free(machin); // OK.
    free(machin); // Boum, ou pas boum ? Comportement indéfini d'après la doc...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    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 122
    Billets dans le blog
    148
    Par défaut
    uITRON, c'est le nom du système. C'est pour les microprocesseur.
    Le microprocesseur sur lequel on fait tourner ça vient de chez Renesas ( et leur compilo est vraiment pas gentil ( super strict )).

    Et le double free ... ça fait boum très ( trop ) facilement ( du moins, je l'ai jamais vu ne pas faire boum )... ah si ... maintenant je me rapelle, avec gcc, il y a une option ( si c'est bien pour ce cas là ) qui dit de pas faire l'erreur ( avec le dump ) dans ce cas là.
    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.

Discussions similaires

  1. Réponses: 16
    Dernier message: 27/05/2017, 10h14
  2. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  3. tbitmap.free dans une function
    Par portu dans le forum Langage
    Réponses: 7
    Dernier message: 19/06/2003, 22h08
  4. [VB6] [BDD] Recordset et champ égal à Null
    Par Gr|ppen dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/03/2003, 10h00
  5. "ALTERER" une col. NULL en NOT NULL - Int
    Par Gandalf24 dans le forum SQL
    Réponses: 2
    Dernier message: 28/12/2002, 00h07

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