2010-07-24 5 views
1

Je crée une classe pour une liaison Lua qui contient un pointeur et qui peut être modifiée par le scripteur. Il inclura quelques fonctions telles que: ReadString et: ReadBool, mais je ne veux pas que l'application plante quand je peux dire que l'adresse fournie va provoquer une violation d'accès.Comment détecter si une adresse va provoquer une violation d'accès?

Est-ce un bon moyen de détecter si une adresse est en dehors de la mémoire lisible/inscriptible? Merci!

Une bibliothèque de fonctions qui peuvent être utiles sont les bibliothèques de fonctions « virtuelles », par exemple VirtualQuery

Je ne cherche pas vraiment pour une conception à toute épreuve, je veux juste d'omettre les évidentes (pointeurs nuls, ainsi pointeurs en dehors de l'emplacement de mémoire possible)

Je comprends à quel point cette bibliothèque est dangereuse, et je ne cherche pas la sécurité, juste la santé mentale.

+3

Il n'y a pas de manière standard. Mieux vaut l'empêcher de se produire en premier lieu. – GManNickG

+0

Vous trouverez peut-être plus simple d'écrire du code légal fonctionnel. – jalf

Répondre

4

Il existe des moyens, mais ils ne servent pas le but que vous avez l'intention. C'est; oui, vous pouvez déterminer si une adresse semble être valide au moment présent. Mais; non, vous ne pouvez pas déterminer si cette adresse sera valide à quelques cycles d'horloge à partir de maintenant. Un autre thread pourrait changer la carte mémoire virtuelle et une adresse précédemment valide deviendrait invalide. La seule façon de gérer correctement la possibilité d'accéder aux pointeurs suspects consiste à utiliser la gestion des exceptions natives disponible sur votre plate-forme. Cela peut impliquer la manipulation du signal SIG_BUS ou il peut impliquer l'utilisation des extensions propriétaire __try et __catch.

L'idiome à utiliser est celui dans lequel vous tentez l'accès, et gérez explicitement l'exception qui en résulte, s'il y en a.

Vous avez également le problème de veiller à ce que les pointeurs vous revenez à point de votre mémoire ou à une autre mémoire . Pour cela, vous pouvez faire votre propre structure de données, un arbre vient à l'esprit, qui stocke les plages d'adresses valides que vos "pointeurs" peuvent atteindre. Sinon, le code de script peut vous donner quelques adresses absolues et vous allez modifier les structures de mémoire par le système d'exploitation pour l'environnement de processus. L'application à propos de laquelle vous écrivez est hautement suspecte et vous devriez probablement recommencer avec un design moins explosif. Mais je pensais que je te dirais comment jouer avec le feu si tu le veux vraiment.

+0

Eh bien, la conception elle-même est explosive pour commencer. Ce n'est pas comme si tout le monde allait utiliser ces fonctions, c'est essentiellement une bibliothèque de fonctions dangereuses pour servir un but précis. – Gbps

+0

Je fais ce genre de choses. Donc, il y a des matchs pour vous. Je n'utiliserais pas l'approche VirtualQuery en raison de la condition de concurrence. Utilisez simplement __try et __catch. Si vous devez convertir un pointeur en un bon argument pour VirtualQuery, masquez juste les bits du pointeur qui sont inférieurs à une granularité de taille de page, et vous avez l'adresse de la page. –

+0

Oh, vous étiez plus rapide. Voici un pointeur vers MSDN Docs, qui explique pourquoi IsBadReadPtr() est en fait une mauvaise idée et pourquoi personne ne devrait l'utiliser: http://msdn.microsoft.com/en-us/library/aa366713(v=VS. 85) .aspx –

0

Il n'y a pas, et c'est pourquoi vous ne devriez jamais faire des choses comme ça.

+0

Eh bien, il y a évidemment une position définie de chaque section dans la mémoire, ce n'est pas comme si vous NE POUVEZ PAS dire POSSIBLEMENT que quelque chose est en dehors de l'emplacement de la mémoire virtuelle. – Gbps

+0

L'OS peut savoir. Mais il ne vous dit pas - respectivement, il n'y a aucun moyen (je sais) de le demander. A condition qu'il y ait un OS et/ou une mémoire virtuelle du tout. – delnan

+0

Il existe un moyen de dire si OS croit que certaines zones sont libres et donc bloquées; il n'y a aucun moyen de vérifier si un endroit aléatoire dans la mémoire est un bon endroit pour stocker/lire vos données, parce que vous devriez le savoir. – mbq

-1

Essayez peut-être d'utiliser segvcatch, qui peut convertir des segfaults en exceptions C++.

2

Découvrez le blog post de Raymond Chen, qui explique plus en détail pourquoi cette pratique est mauvaise. Le plus intéressant, il souligne que, une fois qu'une page est testée par IsBadReadPtr, d'autres accès à cette page ne soulèveront pas d'exceptions!