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 :

De la non nullité des références


Sujet :

C++

  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut De la non nullité des références
    Bonjour

    On lit souvent que les références ne sont jamais nulles. C'est exact. On lit aussi que cela apporte une garantie car les pointeurs peuvent être NULL.

    Pourtant on a vite fait de foutre la merde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
     
    int main()
    {
    	int * i = new int(5);
    	int& ref = *i;
    	delete i;
     
    	std::cout << ref << std::endl;
     
    	return 0;
    }
    Le programme a un comportement indéterminé. Dans ce cas précis :
    - Le programme fait n'importe quoi, et il ne plante pas.
    - On a aucun moyen de tester la validité ou pas de la référence. Avec un pointeur NULL, au moins, on peut faire un test (même si on a aucune garantie lorsqu'il ne l'est pas).

    Notons que DrMemory détecte bien le problème (je suppose que valgrind aussi).

    D'accord, les références n'ont pas été pensées pour ce type d'usage,etc. Mais n'est ce pas un peu exagéré que dire que les références sont sûres et qu'elles apportent une garantie de validité de l'appel ?

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Le programme a un comportement indéterminé.
    Donc ce n'est pas un programme

    Il ne faut pas confondre ce qu'on peut faire et ce qu'on a le droit de faire. Faire pointer une référence sur un objet alloué dynamiquement lorsque la référence a une durée de vie qui excède celle de l'objet référencé, c'est une recette formidable pour se tirer une balle dans le pied. Dans le principe, si tu commence à te dire qu'il te faudrait pouvoir tester la validité d'une référence, c'est que tu fais quelque chose qui n'est pas bien du tout. Nous sommes des gens civilisés, et nous ne plongeons pas nu dans un bain de lave en fusion pour voir ce que ça fait

    Ce n'est donc pas exagéré de dire que les références sont plus sure que les pointeurs (après tout, on peut faire des choses encore pire avec les pointeurs). Dire que les références sont sûres est un propos à nuancer - mais si elles sont bien utilisées, alors ça ne devrait pas poser de problème.

    Il y a d'autres utilisation plus communes des références qui peuvent provoquer des dégâts : par exemple, retourner une référence sur une variable locale automatique (c'est à dire allouée sur la pile) d'une fonction. Aucune des utilisations à risque n'est une utilisation normale des références. hors notre métier consiste principalement à faire les choses correctement (même s'il faut inventer de nouveaux usages de temps en temps ; on détourne, on ne casse pas). Aller au delà et se plaindre que ça ne marche pas, c'est assez peu utile en fait
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Je suis parfaitement d'accord avec tout ça. D'ailleurs je ne me plains pas ! Mais j'ai souvent l'impression de lire un discours du genre "avec une référence, tu n'auras pas de problème" quand on s'adresse à un débutant. C'est un peu risqué d'inculquer ça amha.

    Je vais essayer de retrouver les topics dont je parle.

  4. #4
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    j'aimerai ajouter au passage que après cette ligne
    "i" n'est pas null non plus, donc on a pas de moyen de vérifier que le pointeur est toujours valide.

  5. #5
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Bonjour

    On lit souvent que les références ne sont jamais nulles. C'est exact. On lit aussi que cela apporte une garantie car les pointeurs peuvent être NULL.

    Pourtant on a vite fait de foutre la merde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
     
    int main()
    {
    	int * i = new int(5);
    	int& ref = *i;
    	delete i;
     
    	std::cout << ref << std::endl;
     
    	return 0;
    }
    Le programme a un comportement indéterminé. Dans ce cas précis :
    - Le programme fait n'importe quoi, et il ne plante pas.
    - On a aucun moyen de tester la validité ou pas de la référence. Avec un pointeur NULL, au moins, on peut faire un test (même si on a aucune garantie lorsqu'il ne l'est pas).

    Notons que DrMemory détecte bien le problème (je suppose que valgrind aussi).

    D'accord, les références n'ont pas été pensées pour ce type d'usage,etc. Mais n'est ce pas un peu exagéré que dire que les références sont sûres et qu'elles apportent une garantie de validité de l'appel ?
    Non, c'est pas exagéré. C'est comme le célébre : "sisi une référence peut être NULL regardez :
    int* i = NULL;
    int& z = *i;"

    sauf que nan... tu déréférences un pointeur NULL donc UB donc bah, t'es plus dans le cadre définie par le standard comme un programme bien formé.

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Je suis parfaitement d'accord avec tout ça. D'ailleurs je ne me plains pas ! Mais j'ai souvent l'impression de lire un discours du genre "avec une référence, tu n'auras pas de problème" quand on s'adresse à un débutant. C'est un peu risqué d'inculquer ça amha.

    Je vais essayer de retrouver les topics dont je parle.
    Te fatigue pas : leur nombre est proportionnel au nombre de topic qui parlent de références nulles, dans une proportion de 20 pour 1, et proportionnel au nombre de topic qui parlent de pointeurs, dans une proportion de 1 pour 5.

    (non, les chiffres ne sont pas vérifiés )

    A chaque fois qu'on voit un pointeur quelque part, on parle de référence. Et pour un débutant, les références, c'est bien bien mieux : le nombre de problèmes à gérer diminue de manière drastique. Ce qui serait risqué, c'est de lui dire que les références ne sont pas sûres - vu la dangerosité des pointeurs, dont il n'a pas forcément conscience (sinon il ne les utiliserait pas), ça risque de lui faire éviter les références alors qu'il devrait les utiliser
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    A chaque fois qu'on voit un pointeur quelque part, on parle de référence. Et pour un débutant, les références, c'est bien bien mieux : le nombre de problèmes à gérer diminue de manière drastique. Ce qui serait risqué, c'est de lui dire que les références ne sont pas sûres - vu la dangerosité des pointeurs, dont il n'a pas forcément conscience (sinon il ne les utiliserait pas), ça risque de lui faire éviter les références alors qu'il devrait les utiliser
    Cet argumentaire m'a convaincu.

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Mon propre argumentaire n'est pas "avec les références, jamais de problème" mais "avec les références, jamais de problème tant qu'on ne joue pas avec des pointeurs".

    À ma connaissance, un programme avec uniquement des références et sans pointeur (ni tableau/vecteur aux bornes non-vérifiées) ne peut pas avoir de référence invalide.
    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.

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    À ma connaissance, un programme avec uniquement des références et sans pointeur (ni tableau/vecteur aux bornes non-vérifiées) ne peut pas avoir de référence invalide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int& foo() { int i; return i; }

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Chapeau.
    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.

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

Discussions similaires

  1. [XL-2003] Liste des références non actives
    Par JonesKCD dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/04/2012, 16h49
  2. Réponses: 3
    Dernier message: 20/07/2007, 11h50
  3. Réponses: 4
    Dernier message: 08/06/2006, 23h04

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