2009-03-25 7 views
3

Je travaille avec C++ non géré, le problème que j'ai se produit lorsque j'appelle une méthode qui renvoie un LPVOID.Comment faire pour valider LPVOID à <Bad Ptr>

LPVOID MyMethod(...); 

Le problème est que cette méthode retourne parfois un mauvais Ptr et je veux savoir s'il y a un moyen de détecter ce, si la valeur retournée est un mauvais Ptr.

J'ai essayé de demander si c'est NULL sans chance. La seule façon dont je me rends compte si le résultat est un mauvais Ptr est pendant que je débogue, j'ai essayé de différentes manières mais toujours incapable de le faire.

+0

Du code, s'il vous plaît. – dirkgently

+0

ne retourne pas un "mauvais pointeur", renvoyer la valeur NULL à la place, car vous pouvez vérifier correctement. –

Répondre

10

Non, il n'existe aucun moyen simple de déterminer si un pointeur est défectueux.

Windows a IsBadReadPtr, IsBadWritePtr. Ces fonctions sont intrinsèquement erronées - elles déterminent seulement si une fonction est lisible ou inscriptible dans votre espace d'adressage au moment de l'appel. Ils peuvent également être la cause de securityissues et ne devraient jamais être utilisés.

Le problème principal est qu'il n'y a aucun moyen de différencier un "mauvais" pointeur qui est toujours accessible à votre processus, et un bon pointeur.

Par exemple,

int g[5]; 
int somethingElse; 

void* GetPointer() 
{ 
    return &g[5]; // Whoops, off by one. 
} 

& g [5] est probablement un pointeur valide dans votre processus, et pourrait pointer vers somethingElse, vous serez en mesure d'y accéder sans se briser, mais écrit ce sera corrompre votre état.

+0

Voir aussi http://blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx – Eclipse

8

Votre vrai problème est que vous appelez une fonction qui renvoie des pointeurs erronés. Avez-vous accès à son code source? 90% du temps j'ai rencontré des problèmes comme ceci, c'est parce que:

1) la fonction renvoie un pointeur vers la pile; par exemple,

char a[10]; 
... 
return a; 

2) La fonction renvoie un pointeur qui n'a jamais été attribué mémoire valide pour commencer:

char* foo; // Invalid pointer 
... 
return foo; 

3) La fonction renvoie un pointeur qui a déjà été supprimé (ou libre » d):

char* foo = new char[10]; 
... 
delete[] foo; 
return foo; 

Vous avez vraiment besoin de trouver le vrai problème, plutôt que de contourner ce problème.

1

LPVOID est un typedef à un pointeur vers void, Visual Studio affiche généralement NULL valeurs comme « mauvais pointeur » dans le volet de la montre, êtes-vous sûr que ce pointeur n'est pas NULL?

+0

Raymond Chen's apparaît comme NULL sur ma machine, et apparaît quand quelque chose est vraiment FUBARed et il y a En aucun cas, l'adresse conservée pourrait être valide. – crashmstr

Questions connexes