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

Visual C++ Discussion :

Bien gérer les pointeurs


Sujet :

Visual C++

  1. #1
    bruce-willis
    Invité(e)
    Par défaut Bien gérer les pointeurs
    Bonjour,

    Dans le but de bien coder et éviter tout bug de mon code, comment traiter un pointeur avant de l'utiliser c'est à dire mettre un point ou un -> après?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (pTable->GetValue(6))
                   ((CBCGPGridItem*)(pTable->GetValue(6)))->AddFieldYard(*cClass);
    (ici GetValue retourne un pointeur)
    ne suffit pas je pense car quelquefois les pointeurs prennent des valeurs non valides mais pas NULL: 0xCCCCCCCC, 0xCDCDCDCD, etc*

    Je ne sais pas si je trop prévoyant mais les codes open source que j'ai regardé ne prêtent pas attention à cela!! Or je pense qu'il faut toujours tester un pointeur avant de l'utiliser, quelquefois, on a déjà libéré le pointeur avant

  2. #2
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Il faut toujours initialiser ses pointeurs. Et bien évidemment les tester avant usage pour vérifier qu'ils ne sont pas égaux à NULL.

  3. #3
    bruce-willis
    Invité(e)
    Par défaut
    Citation Envoyé par TheGzD Voir le message
    Il faut toujours initialiser ses pointeurs. Et bien évidemment les tester avant usage pour vérifier qu'ils ne sont pas égaux à NULL.
    C'est un peu ce que j'avais dit!
    Un pointeur non NULL ne veut pas dire OK !!!

  4. #4
    bruce-willis
    Invité(e)
    Par défaut
    Un article en anglais relevait les 5 erreurs en programmation C++:
    1. Null Pointer dereference
    2. Null pointer dereference from function
    3. Memory leaks
    4. Array index out of bounds
    5. Uninitialized variables

    http://kloctalk.klocwork.com/?tag=nu...er-dereference

    Ce que j'aimerais apprendre c'est comment gérer 1. Null Pointer dereference

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Un truc comme cela ? (ou alors je n'ai pas compris)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
    if(ptr == NULL)
    {
       // leve une exception ou retourne une erreur (au choix)
       throw exception;
       return false;
    }
    int ma_variable = *ptr;
    ...

  6. #6
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Pour gérer un pointeur non NULL mais pointant vers une méthode ou un membre donnée incorrect on pourrait être tenter de gérer l'exception résultante (via try / catch par exemple) mais c'est une très mauvaise idée.

    On trouve souvent ce genre de problème lors de tests d'injection de fautes sur programmes.

    La solution est de prendre le problème à l'envers: non pas "comment je gère ce problème ?" mais se demander plutôt "comment puis-je pour que cela n'arrive pas !"

    Chaque problématique appelle une solution précise.

    Exemple: Dans le cas d'un "use after free" - utilisation d'un pointeur ou de données en mémoire alors que le pointeur (ou le bloc mémoire) a déjà été libéré - il faut s'assurer que justement on ne va pas tenter d'utiliser un pointeur déjà libérer.

    Solution: Quand un pointeur est libéré, on le force automatiquement à NULL et tous les tests subséquents s'effectueront sur NULL, comme le montre l'exemple de ram-0000.

    La base de donnée des faiblesses communes en programmation s'appelle CWE (Common Weakness Enumeration), je la recommande vivement:

    http://cwe.mitre.org/data/index.html

    Exemple avec le CWE-416 (use after free) :

    http://cwe.mitre.org/data/definitions/416.html

  7. #7
    bruce-willis
    Invité(e)
    Par défaut
    Je suis entrain de lire ce tuto: http://loic-joly.developpez.com/tuto...mart-pointers/ pour voir si ça me convient?

    Neitsa, je ne comprends pas bien où veux-tu en venir?

  8. #8
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Si tu sais avec précision que tu n'utilises plus ton pointeur tu l'initialises à NULL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // work work work...
    if(pObject)
    {
            delete pObject;     // bon j'en finis avec 
            pObject = NULL;   // et je le ramène à NULL pour prévenir.
    }

  9. #9
    bruce-willis
    Invité(e)
    Par défaut
    New est un opérateur retournant un pointeur, donc à gérer aussi!

    Que diriez-vous si je fais à partir de maintenant cette transformation à chaque utilisation de NEW
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	CLoad* pSET = new CLoad(44, NULL);
     
    	if (pSET)
    	{
    		m_pListEntity->push_back(pSET);
    	}
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       std::auto_ptr<CLoad> pSET(new CLoad(44, NULL));
       m_pListEntity->push_back(pSET.get());
       pSET.release();
    Utilisation de auto_ptr dans l'en-tête <memory>

Discussions similaires

  1. [Connection DB] Bien gérer les connexions !
    Par rad_hass dans le forum C#
    Réponses: 11
    Dernier message: 25/02/2008, 17h44
  2. Réponses: 3
    Dernier message: 29/05/2007, 17h50
  3. [Include/Require] Comment bien gérer les chemins ?
    Par Wookai dans le forum Langage
    Réponses: 1
    Dernier message: 11/04/2007, 10h11
  4. Comment bien gérer les utilisateurs multiples
    Par Vesta dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/06/2006, 09h48
  5. [JDesktopPane] Comment bien gérer les JInternalFrame ?
    Par calogerogigante dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 05/04/2006, 13h45

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