2010-10-19 19 views
0

J'écris du code qui doit être compilé et exécuté sans erreur sur Unix/Mac (avec GCC) et sur Win32 (avec mingw). Le code doit fonctionner dans une grande variété d'environnements différents et il a des modules chargeables que je ne peux pas contrôler, donc je protège typiquement chaque module avec un setjmp() et un signal().Comment SIGSEGV est-il différent sur Win32 que sur Unix?

Je vois que WIN32 a à la fois setjmp() et signal(). Le code fonctionnera-t-il de manière portable ou dois-je m'inquiéter?

Répondre

2

Allez-y et vous inquiétez pas. Le CRT devrait émuler signal() mais le MSVC mentionne explicitement que longjmp() n'est pas légal dans un gestionnaire à moins qu'il ne gère SIGFPE. Vérifiez le vôtre.

L'équivalent de SIGSEGV est une exception SEH avec le code d'exception 0xc0000005 (STATUS_ACCESS_VIOLATION). Le compilateur MSVC permet de les attraper avec les mots-clés __try et __except.

L'idée de "protéger" un module comme celui-ci est profondément erronée. L'état de votre programme est corrompu irréparable, vous n'avez aucune idée de la façon dont il a été muté de sorte que vous n'avez aucune chance de le restaurer. Continuer à courir peut causer un certain nombre de mésaventures. Vous serez chanceux quand il mourra sur une autre exception, ne vous donnant aucune idée de ce que le vrai problème était, mais il est plus susceptible de générer simplement de mauvaises données qui ne seront pas diagnostiquées pendant longtemps. Il vaut mieux ne pas écrire du code comme ça. Et résolvez votre problème de portage dans le processus.

+0

Merci pour le message. Je vais essayer d'utiliser __try et __except. J'utilisais un try and catch (à partir de C++), mais ça ne faisait pas la magie que je voulais. – vy32

+0

En règle générale, les problèmes rencontrés ne sont pas des erreurs d'écriture, mais plutôt des erreurs de lecture. Ils sont le plus souvent causés car un décodeur fait confiance à une valeur de pointeur qui ne devrait pas l'être. Je sais que cette approche est profondément erronée, mais elle est malheureusement meilleure que l'alternative. – vy32

+0

Le suivi - __try et __except ne fonctionnent pas sous mingw, mais SIGSEGV est intercepté avec mingw avec signal(). – vy32