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 �prouv�
    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 : 43
    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
    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 : 62
    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
    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;
    ...
    Raymond
    Vous souhaitez participer � la rubrique R�seaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs syst�me et r�seau � configurer leurs �quipements SNMP r�seau.
    e-verbe Un logiciel de conjugaison des verbes de la langue fran�aise.

    Ma page personnelle sur DVP
    .

  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
    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 �m�rite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    D�tails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    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, 16h44
  2. R�ponses: 3
    Dernier message: 29/05/2007, 16h50
  3. [Include/Require] Comment bien g�rer les chemins ?
    Par Wookai dans le forum Langage
    R�ponses: 1
    Dernier message: 11/04/2007, 09h11
  4. Comment bien g�rer les utilisateurs multiples
    Par Vesta dans le forum MS SQL Server
    R�ponses: 3
    Dernier message: 29/06/2006, 08h48
  5. [JDesktopPane] Comment bien g�rer les JInternalFrame ?
    Par calogerogigante dans le forum AWT/Swing
    R�ponses: 4
    Dernier message: 05/04/2006, 12h45

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