Les gestionnaires d’erreurs de segmentation doivent-ils être écrits par un programmeur d’application en C?

Si quelqu’un est un programmeur de système d’exploitation ou écrit un code de bibliothèque de niveau système, il est logique d’écrire un gestionnaire d’erreur de segmentation. Comme par exemple, le programmeur OS écrit le code et envoie un signal SIGSEGV à ce processus d’application. OU un programmeur de bibliothèque de systèmes peut gérer ce signal SIGSEGV et annuler les opérations provoquées par le code de la bibliothèque pour créer une erreur de segmentation. Mais pourquoi un programmeur d’application en C aurait-il besoin d’écrire un gestionnaire de fautes de segmentation? S’il écrit un gestionnaire, il a déjà corrompu certaines parties de la mémoire. Pouvez-vous donner à un programmeur d’application une instance capable de gérer les erreurs de segmentation et de poursuivre l’exécution du programme?

Le traitement de SIGSEGV , etc., peut permettre de sauvegarder l’état et de prendre des mesures correctives. Mr 32 (et autres) sont corrects et vous ne pouvez pas simplement redémarrer le code de la ligne principale. Au lieu de cela, vous pouvez longjmp() siglongjmp() ; Cela permet de redémarrer la ligne principale. En outre, vous devez faire très attention d’appeler uniquement les fonctions async safe . C’est très délicat. Cependant, certaines applications sont,

  1. Santé / sécurité – pour éviter une situation catastrophique.
  2. Financier – perte de données de transaction pouvant entraîner une perte d’argent.
  3. Système de contrôle – exemple de logiciel de titrage pour les chimistes.
  4. Diagnostics – Des conditions d’accident peuvent être enregistrées pour améliorer les futurs logiciels. Selon Jay

Appeler exit() n’est probablement pas bon et _exit() serait meilleur. La différence étant les atexit() .

Voir aussi: Cert async safe , Liste Glibc async-safe , Question similaire , longjmp() et les signaux ne sont pas portables , async-safe
Celles-ci varient d’un système d’exploitation à l’autre. Tout conseil dépendra du système!


Problèmes supplémentaires

  • Certaines bibliothèques utilisées par le programme peuvent attraper SIGSEGV . Sans aucun doute, la version de la firebase database Empress l’accrochera. Vous devez savoir ce que vos bibliothèques utilisent et les enchaîner.
  • La stack et le tas (malloc, etc.) peuvent être corrompus, y compris le jump_buf sorte que votre gestion des erreurs peut être particulièrement paranoïaque.
  • Il existe de nombreuses autres solutions alternatives, telles que le report de parties critiques à une autre tâche beaucoup plus simple.
  • longjmp() appelé depuis un signal n’est pas défini selon la norme C99, mais il fonctionnera bien sur la plupart des systèmes. siglongjmp() peut être utilisé si vous êtes plus pédant. Ce serait bien pour la journalisation des diagnostics, mais je ne l’utiliserais pas pour les autres utilisations énumérées (sécurité, etc.). Notifier une tâche de surveillance peut être plus approprié.

AFAIK, le gestionnaire de segmentation peut être écrit au niveau de l’application pour générer des informations de débogage (telles que le vidage de la mémoire, la valeur des registres et d’autres informations spécifiques à l’application), puis quitter l’application.

Veuillez noter que, étant donné que l’erreur de segmentation peut avoir corrompu la mémoire, il se peut qu’elle ne reçoive pas toutes les informations correctes.

Je ne suis au courant d’aucune situation dans laquelle l’exécution du programme peut être poursuivie après une erreur de segmentation. D’autres utilisateurs estimés de SO pourront peut-être apporter des éclaircissements à ce sujet.

Vous pouvez capter n’importe quel signal sauf SIGKILL, SIGCONT et SIGSTOP. Ainsi, vous pouvez attraper SIGSEGV, mais si vous décidez de ne pas quitter, le comportement sera imprévisible.

 library programmer might handle that signal SIGSEGV and may undo the operations caused by the library code for creating segmentation 

Une erreur de segmentation se produit signifie que les threads ou le processus seront arrêtés.

Vous ne pouvez pas annuler le code a causé l’erreur de segmentation. Vous pouvez plutôt redémarrer ce composant.

Une erreur de segmentation est causée par l’écriture du programme dans une partie de la mémoire qu’il n’est pas censé. Le développeur de l’application n’écrit pas de code pour gérer cela, il écrit pour l’éviter. C’est pourquoi vous devez vérifier lorsque vous écrivez en mémoire.