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 6
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
Rejoignez-nous