Gestion des exceptions pour les violations d'accès dans la norme C
L'accès à la mémoire au-delà des limites d'un objet alloué peut conduire à une exception de violation d'accès. En C standard, il n'est pas possible d'intercepter cette exception directement à l'aide des gestionnaires d'exceptions standard.
Pour gérer les violations d'accès, une approche consiste à utiliser des mécanismes spécifiques à la plate-forme. Cependant, dans cet article, nous explorons une méthode qui exploite les exceptions et la gestion des erreurs dans le standard C.
La magie du lancer et de l'attrape
La clé pour capturer les violations d'accès consiste à lever une exception dans la fonction de gestionnaire de signal, puis à l'intercepter dans le programme principal. Cela garantit que le programme ne se termine pas anormalement lorsque la violation d'accès se produit.
void SignalHandler(int signal) { printf("Signal %d",signal); throw "!Access Violation!"; }
Dans la fonction principale, nous devons définir le gestionnaire de signal pour le signal SIGSEGV (le signal pour les erreurs de segmentation) et établir un essai -catch block pour gérer l'exception.
int main() { typedef void (*SignalHandlerPointer)(int); SignalHandlerPointer previousHandler; previousHandler = signal(SIGSEGV , SignalHandler); try{ *(int *) 0 = 0;// Baaaaaaad thing that should never be caught. You should write good code in the first place. } catch(char *e) { printf("Exception Caught: %s\n",e); } printf("Now we continue, unhindered, like the abomination never happened. (I am an EVIL genius)\n"); printf("But please kids, DONT TRY THIS AT HOME ;)\n"); }
Conclusion
Pendant la capture Les violations d'accès dans la norme C ne sont pas simples, l'approche présentée dans cet article offre un moyen de gérer ces exceptions par programme. En utilisant des gestionnaires de signaux et des mécanismes de gestion des exceptions, les développeurs peuvent créer un code plus robuste capable de récupérer facilement de telles erreurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!