1 votes

SEH, violation d'accès et page de garde de la pile

J'ai posté un question sur la validation de l'accessibilité d'un pointeur. La conclusion était soit d'utiliser IsBadReadPtr pour vérifier le pointeur, soit SEH pour attraper l'exception (et de préférence de n'utiliser ni l'un ni l'autre, et de déboguer l'application, mais ce n'est pas le problème ici).

IsBadReadPtr est dit mauvais parce que, entre autres raisons, il essaierait de lire le pointeur, et attraperait toute exception. Il pourrait attraper une exception de page de garde de la pile et l'empêche ainsi d'atteindre le gestionnaire de mémoire, qui aurait dû agrandir la pile.

Si j'utilise SEH et que j'attrape uniquement les exceptions EXCEPTION_ ACCESS_VIOLATION, cela créerait-il le même problème ?

Autre chose : quelles sont les implications de l'utilisation du SEH ? Ce site L'article suggère que "le compilateur ne peut pas effectuer d'analyse de flux dans le code protégé par SEH". Qu'en est-il si j'appelle une fonction à l'intérieur du bloc __try. Le compilateur n'optimiserait-il pas du tout la fonction appelée ?

1voto

ChrisW Points 37322

Si j'utilise SEH et que j'attrape uniquement les exceptions EXCEPTION_ ACCESS_VIOLATION, cela créerait-il le même problème ?

Je pense que oui. Une solution de contournement pourrait être de sonder la pile de tous les threads que vous connaissez et dont vous vous souciez, avant de commencer à appeler IsBadReadPtr (par "sonder la pile", je veux dire toucher délibérément chaque page de mémoire dans la pile, pour s'assurer que chaque page est pré-allouée).

Le compilateur n'optimiserait-il pas du tout la fonction appelée ?

Si la fonction n'est pas inlined, je m'attendrais à ce que le compilateur applique les optimisations habituelles (l'optimisation de la fonction ne serait pas affectée par l'endroit d'où la fonction est appelée).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X