[C TOTW 4] Equivalent de try / catch / throw en C
|
15-09-2014, 10h00
Message : #1
|
|
ark
![]() Psyckomodo! ![]() ![]() ![]() ![]() ![]() Messages : 1,033 Sujets : 48 Points: 317 Inscription : Sep 2011 |
[C TOTW 4] Equivalent de try / catch / throw en C
Encore un lundi, encore un Tip Of The Week :D (Faut croire que j'avais zappe qu'on était lundi, mais bon comme je suis prévoyant, tout va bien !)
Alors, celui la vient de quand je tentais de trouver une solution alternative au challenge de ce thread : http://n-pn.fr/forum/showthread.php?tid=3737 et plus particulièrement sur la partie updated par Wapiflapi. Mon idée était donc de partir sur comment faire l’équivalent des jmp asm, mais en utilisant uniquement des fonctions de la libc. Bref, j'ai donc fouille un peu dans les pages de man, et je suis tombe sur deux fonctions plutôt intéressantes. La première, setjmp() permet de créer un contexte, c'est a dire sauvegarder tous les registres en cours. La seconde, longjmp() va prendre un contexte en paramètre et réinitialiser tous les registres avec ca. Il y a aussi moyen de sauvegarder les signaux, mais je vous laisse le plaisir de le découvrir en lisant le man ;) Bref, donc j'ai fait deux 3 tests au debut avec ca, voici les codes, je vous laisse lire : Exemple 1 : Code C :
Ici en utilisant ces fonctions, on arrive a faire une boucle afin de donner a i la valeur 8. Et l'exemple 2 montre cette utilisation dans une autre fonction : Code C :
Voila voila, plutot simple. Bon, a partir de la j'ai commencer a chercher une solution pour le challenge, mais je l'ai pas mener a bout (pour l'instant ! x)) Et donc j'en suis arrive a me dire qu'avec ce genre de truc, on doit pouvoir coder des trucs intéressants, en particulier si on y ajoute les fonctions signal() et kill(). Du coup, j'en suis venu a faire l’implémentation d'un équivalent a try, catch et throw en C++. Voici le code, je vous explique après : Code C :
Donc, premièrement, je définis deux variables globales, static (pas besoin dans ce cas de les réutiliser ailleurs, mais il pourrait être mieux de les mettre dans un .h et les appeler en externe si vous compter utiliser ce truc dans un vrai projet.). Ces deux variables vont permettre de store le contexte et le type d'erreur. Je crée ensuite une fonction handler pour le signal abort, que la macro throw lancera lorsqu'il sera appelé. C'est elle qui va restaurer le contexe en appelant longjmp(). Voici ensuite la définition de mes deux macros, Code C :
Alors, tout simplement, ma macro try va set le handler pour le SIGABRT puis il set le contexte pour setjmp. Si setjmp renvoi 0, c'est qu'il a été appelé directement, si il renvoi 1, c'est qu'il a été call depuis un longjmp. Donc, dans le cas ou c'est 0, on est dans le try (on exec x) et sinon, on est dans le catch et on va exec y. La macro throw va quand a elle prendre deux paramètres, le premier étant une expression, et l'autre, le type d'erreur qu'on va retourner si l'expression est fausse. Ensuite, ben j'ai définis un enum d'exceptions, et leur types dans un tableau statique en dessous. Et enfin, un peu de code pour le test ! :p Donc, voici quelques tests : Code BASH :
Voila, ca sera tout ! Vous pouvez retrouver le code sur mon github : https://github.com/Ark444/PoCz/tree/master/try_catch_c C'est la dessus que je ferrai des updates! ;) Bref, si vous avez des questions, des remarques, etc, n’hésitez pas ! |
|
« Sujet précédent | Sujet suivant »
|
Sujets apparemment similaires… | |||||
Sujet | Auteur | Réponses | Affichages | Dernier message | |
[C TOTW 6] Xor tricks | ark | 7 | 3,678 |
06-03-2016, 23h36 Dernier message: Commodor |
|
[C TOTW 2] Parcours de tableau | ark | 5 | 2,413 |
29-09-2014, 17h44 Dernier message: crown |
|
[C TOTW 5] bitfields ! | ark | 4 | 2,193 |
23-09-2014, 11h17 Dernier message: Aniem |
|
[C TOTW 3] #warning, #error | ark | 1 | 1,382 |
10-09-2014, 11h49 Dernier message: ark |
|
[C TOTW 1] Trick avec #include | ark | 10 | 4,236 |
01-09-2014, 18h23 Dernier message: Commodor |
Utilisateur(s) parcourant ce sujet : 1 visiteur(s)