2017-06-26 3 views
0

J'utilisais un projet MFC, qui devait être protégé dans un environnement indépendant de la plate-forme, en utilisant la fonction std au lieu de MFC/AFX. Par exemple: au lieu de CString la chaîne std ::, à la place CMutex le std :: mutex sera utilisé.Quelle est la fonction standard équivalente de la fonction "AfxIsValidAddress"?

Qu'est-ce que la plate-forme indépendante, C++ 11 std :: - équivalent de la fonction MFC "AfxIsValidAddress"?

+0

En C++ standard, il n'y a pas d'équivalent à 'AfxIsValidAddress'. Et pourquoi en avez-vous besoin de toute façon? Quel problème est-il censé résoudre? Dans les versions non-debug, il s'agit simplement d'une vérification null-pointeur. –

+0

Si je vérifie l'implémentation, alors je vois plus de contrôles à la fois, à l'intérieur de cette fonction. Sont-ils tous inactifs dans les builds non-debug ou quoi? –

+1

Si vous devez utiliser 'AfxIsValidAddress', votre code a un bug. Corrigez le bogue, oubliez l'implémentation défectueuse de MFC (appelez une API Windows défectueuse). L'indépendance de la plate-forme, 'std ::' -equivalent C++ 11 est de ne pas en avoir besoin. Si vous le faites, vous êtes en terre UB, et aucune garantie ne s'applique. – IInspectable

Répondre

3

Il n'y a pas quelque chose de similaire à AfxIsValidAddress() dans la bibliothèque standard et il semble que la fonction ne fait pas vraiment autant de validation.

Voir AfxIsValidAddress (and Others) Don’t Work as Advertised qui indique que la fonction finit par effectuer une vérification par rapport à la valeur NULL. Il a également ceci à dire à propos de la famille des fonctions de contrôle d'adresse valides:

Il y a plusieurs API Win32 des fonctionnalités similaires: IsBadWritePtr, IsBadHugeWritePtr, IsBadReadPtr, IsBadHugeReadPtr, IsBadCodePtr, IsBadStringPtr. Il a été connu depuis au moins 2004 que ces fonctions sont cassées au-delà de la réparation et ne devraient jamais être utilisées. Le Tout-Puissant Raymond Chen et Larry Osterman à la fois discuter les raisons dans détail, donc juste un bref rehash: IsBad * Ptr tous les travaux en accédant à l'adresse testée et attraper toutes les exceptions levées. Le problème est qu'un certains de ces violations d'accès (à savoir, ceux sur stack stack pages) ne devrait jamais être attrapé - le système d'exploitation les utilise pour agrandir correctement les piles de fil .

Je pense qu'il est préférable de simplement suivre les procédures standard C++ pour vérifier qu'un pointeur est pas un nullptr ou mieux encore de limiter l'utilisation de pointeurs autant que possible.