Comment traiter l'erreur d'un pointeur foireux ?

Résolu
cs_Booster
Messages postés
235
Date d'inscription
mercredi 30 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2009
- 16 mars 2008 à 23:50
cs_Booster
Messages postés
235
Date d'inscription
mercredi 30 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2009
- 17 mars 2008 à 15:34
Bonsoir à tous,

Alors voilà j'ai une fonction comme suit :

bool Fonction (void * ptr, int tailleptr){
    char message[2000];

    memcpy(message , ptr , tailleptr); //tailleptr < 2000
}
(J'ai isolé le contexte)

Le problème est que cette fonction peut recevoir un pointeur non null et non initialisé :( donc du cou je vais taper dans des zones mémoires illicite et j'ai de beaux messages d'erreur :  "memory could not be read..." (Au moment de faire le memcpy())

Comment puis-je traiter cette erreur ? Sachant que le ptr n'est pas null mais n'est pas lisible non plus !?

Merci d'avance de vos réponses !

10 réponses

cs_Booster
Messages postés
235
Date d'inscription
mercredi 30 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2009

17 mars 2008 à 15:34
Désolé, En fait c'est bon, l'erreur ne venez pas de là et la fonction sBadReadPtr() marche très bien :D.
En gros (Pour résumé si ça en intéresse certains) je pensais que c'était au moment de la lecture que le PTR était foireux, mais c'est au moment de l'écriture (Dans un autre pointeur) que ça plante car ma fonction ressemble en réalité à ceci :

bool Fonction (void * ptrENTRER, void * ptrSORTIE, int tailleptr){
    char message[2000];
    memcpy(message , ptr , tailleptr); //tailleptr < 2000
    //Traitement message
    ptrSORTIE[0] = 0x01; //Par exemple
}

Et c'est ce ptrSORTIE qui n'est pas bon (Je ne l'avais pas présisé, car je pensais que c'était bon (ça marchait bien au début ...))
Bref et du cou mon ENTRER est ok malgré que j'ai un 0x71A57980 qui traine en entrée ça n'a pas l'air de le perturber (Je pensais vraiment que c'était ça !)

Merci beaucoup pour vos réponses !
3
Neo_Fr
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
17 mars 2008 à 01:48
Salut,
Tu peux utiliser IsBadWritePtr:
http://msdn2.microsoft.com/en-us/library/aa366716(VS.85).aspx

Neo_Fr
0
SAKingdom
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
17 mars 2008 à 03:52
Ce n'est pas le droit en écriture qu'il faut vérifier mais le droit en lecture. IsBadReadPtr.

Très important de considérer l'avertissement de MSDN au sujet de ces fonctions.

C++ (@++)<!--
0
luhtor
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
17 mars 2008 à 10:36
Comment est-ce possible de récupérer un pointeur non nul non intialisé ? un pointeur non initialisé doit être mis à NULL.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Booster
Messages postés
235
Date d'inscription
mercredi 30 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2009

17 mars 2008 à 10:52
Merci Neo_fr et SAKingdom d'après la MSDN c'est presque pile poil pour mon cas mais malheureusement cela ne marche pas :( snif.

Pour luhtor c'est possible dans le cas où je ne gère en aucun cas l'appelle de ma fonction, c'est windows en quelque sorte qui appelle ma fonction du cou il me passe ce qu'il veut et dans mon cas tout marche ou presque puisque ma fonction est appellée une 15ène de fois et il me passe en paramètre quelque chose du style :

Fonction( 0x0012A430,4);
Fonction( 0x0012A2F8,16);
Fonction( 0x0012A328,16);
....
Fonction(0x71A57980,16);  << Addresse foireuse qui  me plante l'ittérallement l'application.

Si quelqu'un d'autre à une idée ? (sans comparer les pointeurs if (addr!=0x0012) { //Error } ) :D

Merci d'avance ;)
0
cs_Booster
Messages postés
235
Date d'inscription
mercredi 30 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2009

17 mars 2008 à 10:59
Quand je dis que cela ne marche pas en réaliter il me dit qu'il arrive à lire l'adresse... (IsBadReadPtr return false) et pourtant c'est bien une mauvaise adresse !
0
cs_Booster
Messages postés
235
Date d'inscription
mercredi 30 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2009

17 mars 2008 à 12:11
Sinon avec un try catch n'y à t'il pas possibilité de traiter cette erreur ?

J'ai essayé ceci :

bool Fonction (void * ptr, int tailleptr){
    try{
        char message[2000];
        memcpy(message , ptr , tailleptr); //tailleptr < 2000
    }catch(...){
        return false;
    }
}

Mais sans succés, me suis-je trompé ? Ou est ce normal que ceci ne marche pas ?

Merci d'avance !
0
cs_Booster
Messages postés
235
Date d'inscription
mercredi 30 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2009

17 mars 2008 à 13:42
C'est si impossible que ça ? :(
0
cs_Booster
Messages postés
235
Date d'inscription
mercredi 30 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2009

17 mars 2008 à 13:42
C'est si impossible que ça ? :(
0
Neo_Fr
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
17 mars 2008 à 15:22
Tu peux pas poster un peu plus de code?
sinon on trouvera jamais..

Neo_Fr
0