Re: usine à gaz des .h
Bonjour, Philippe Deleval wrote: J'essaie de construire un récupérateur d'erreurs en assembleur et, pour récupérer les erreurs numériques traitées par le signal SIGFPE, [...] J'ai trouvé les symboles souhaités dans /usr/include/i386-linux-gnu/sys/ucontext.h (appelé par /usr/include/ucontext.h) sous un #ifdef __USE_GNU). Or, alors que les identifiants génériques comme ucontext_t, mcontext_t, uc_mcontext ou gregs, sont bien visibles, les REG_EAX, etc... ne le sont pas, gcc me signale un identifiant non déclaré. Ce même si j'essaie d'assurer à la main que __USE_GNU est bien défini avant le #include ucontext.h. Je ne sais pas quel est le problème, mais à tout hasard, voici un exemple rudimentaire qui a l'air de marcher sous Linux alors qu'il fait référence à REG_RIP. /* gcc -std=gnu99 -frounding-math sigfpe.c -lm */ #define _GNU_SOURCE #define __USE_GNU #include signal.h #include fenv.h #include stdio.h #include string.h #include ucontext.h volatile double a, b, c; volatile _Decimal64 d, e, f; static void handler (int sig, siginfo_t * siginfo, void * ucontext) { // unsafe char * descr = ; if (sig == SIGFPE) { switch (siginfo-si_code) { case FPE_INTDIV: descr = integer divide by zero; break; case FPE_INTOVF: descr = integer overflow; break; case FPE_FLTDIV: descr = floating-point divide by zero; break; case FPE_FLTOVF: descr = floating-point overflow; break; case FPE_FLTUND: descr = floating-point underflow; break; case FPE_FLTRES: descr = floating-point inexact result; break; case FPE_FLTINV: descr = floating-point invalid operation; break; case FPE_FLTSUB: descr = subscript out of range; break; } } printf (%s (%s) @ 0x%lx\n, strsignal (sig), descr, siginfo-si_addr); fflush (stdout); ucontext_t *uc; uc = (ucontext_t *) ucontext; c = 42; uc-uc_mcontext.gregs[REG_RIP] += 3; } int main (void) { struct sigaction sa; sa.sa_sigaction = handler; sa.sa_flags = SA_SIGINFO; sigaction (SIGFPE, sa, NULL); feenableexcept (FE_ALL_EXCEPT); d = 0.0DD; e = 0.0DD; f = d / e; a = 1.0; b = 0.0; c = a / b; printf (back!, %g %g %g\n, a, b, c); fflush (stdout); a = 0.0; b = 0.0; c = a / b; printf (back!, %g %g %g\n, a, b, c); fflush (stdout); a = 0.0; b = 0.0; c = a / b; printf (back!, %g %g %g\n, a, b, c); fflush (stdout); return 0; } Cordialement, -- Marc Mezzarobba -- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.org/fr/FrenchLists Pour vous DESABONNER, envoyez un message avec comme objet unsubscribe vers debian-user-french-requ...@lists.debian.org En cas de soucis, contactez EN ANGLAIS listmas...@lists.debian.org Archive: https://lists.debian.org/lotp9d$aj2$1...@ger.gmane.org
usine à gaz des .h
Bonjour à tous j'ai un curieux problème de programmation. J'essaie de construire un récupérateur d'erreurs en assembleur et, pour récupérer les erreurs numériques traitées par le signal SIGFPE, le seul outil que j'ai trouvé (sur /technopark02.blogspot.fr/2005/10/handling-sigfpe.fr) est la construction tournant autour de ucontext.h. Il est bon de tester les idées en C avant de passer en assembleur, aussi j'ai pris le programme donné en exemple sur le site ci-dessus et ai tâché de l'adapter. Le problème est que l'exemple n'est pas codé pour Linux (c'est pour Solaris, si je me souviens bien), et ucontext.h utilise bien sûr des noms liés aux registres comme index du tableau gregs, tel un REG_PC dans l'exemple (PC pour Program Counter, je présume) qui évidemment ne risque pas d'exister sous Linux i386 (c'est EIP ou RIP). J'ai trouvé les symboles souhaités dans /usr/include/i386-linux-gnu/sys/ucontext.h (appelé par /usr/include/ucontext.h) sous un #ifdef __USE_GNU). Or, alors que les identifiants génériques comme ucontext_t, mcontext_t, uc_mcontext ou gregs, sont bien visibles, les REG_EAX, etc... ne le sont pas, gcc me signale un identifiant non déclaré. Ce même si j'essaie d'assurer à la main que __USE_GNU est bien défini avant le #include ucontext.h. Je fais mes essais de compilation par gcc -c -O2, la fonction trouble(), écrite en quatre lignes, se contente de renvoyer 0, elle est là pour masquer son rôle à l'optimiseur et aussi contraindre le générateur de code d'aller chercher son diviseur sur un registre et non dans la pile (vérifié par sortie assembleur avec gcc -S -O2). En remplaçant les REG_E?X par les valeurs (respectivement 8, 9, 10, 11 --- dans l'ordre du texte .c), le programme fonctionne, en affichant une flopée de Caught FPE\n . Si quelqu'un connaît ce terrain là... ou bien dois-je m'adresser à la liste devel? Elle me semble a priori destinée aux développeurs de Linux, non aux développeurs sous Linux. Cordialement Philippe Deleval /* programme fpe trouvé sur internet, avec récupérateur de signal version brute renvoyant le registre eip sur sa valeur avant signal conséquence: signal relancé cycliquement */ #include sys/types.h #include signal.h #include stdio.h #include stdlib.h #include limits.h #include ucontext.h int trouble (); void signal_handler (int signo, siginfo_t *si, void *data) { ucontext_t *uc; /* uc = ((ucontext_t *) data)-uc_link; */ uc = (ucontext_t *) data; switch (signo) { case SIGFPE: fprintf(stdout, Caught FPE\n); /* uc-uc_mcontext.gregs[REG_PC] = uc-uc_mcontext.gregs[REG_nPC]; */ /* remplacé par changement des registres eax à edx */ uc-uc_mcontext.gregs[REG_EBX] = 1; uc-uc_mcontext.gregs[REG_EDX] = 1; uc-uc_mcontext.gregs[REG_ECX] = 1; uc-uc_mcontext.gregs[REG_EAX] = 1; break; default: fprintf(stdout, default handler\n); } } int main (void) { struct sigaction sa, osa; unsigned int b = ULONG_MAX; sa.sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; sa.sa_sigaction = signal_handler; sigaction(SIGFPE, sa, osa); b /= trouble (); printf (Valeur finale: %d\n, b); return b; } int trouble () { return 0; }
Re: [HS] usine à gaz des .h
Le lundi 30 juin 2014, 16:48:16 Philippe Deleval a écrit : Bonjour à tous ’lut, j'ai un curieux problème de programmation. […] /technopark02.blogspot.fr/2005/10/handling-sigfpe.fr [Lien pourri mais ça se retrouve…] […] gcc me signale un identifiant non déclaré. Ce même si j'essaie d'assurer à la main que __USE_GNU est bien défini avant le #include ucontext.h. Normal™, on ne doit pas toucher à __USE_GNU. En revanche, on peut faire un « #define _GNU_SOURCE » et ça va definir __USE_GNU en passant par features.h. C’est (presque) expliqué au début de features.h. Et là ça marche. ’fin, les macros sont accessibles… […] Si quelqu'un connaît ce terrain là... ou bien dois-je m'adresser à la liste devel? Elle me semble a priori destinée aux développeurs de Linux, non aux développeurs sous Linux. Si tu parles de debian-devel-french, elle est destinée¹ aux développeurs Debian francophones ou, plus généralement, aux questions (en français) concernant le développement de Debian (empaquetage, mentorat, signature…). Si tu parles de la LKML, elle est effectivement destinée au développement _de_ Linux. Je ne sais pas comment y serait accueillie ta question mais ça aurait pu se tenter (en reformulant un peu je pense). Il y a peut-être des listes plus orientées « programmation système » sur lesquelles ta question aurait aussi pu être posée. Quoi qu’il en soit, je pense que ta question concerne plus directement la glibc, vu que c’est un problème avec leurs .h. Ou, au pire, sur GCC. (Avec un sujet plus clair et moins conflictuel (genre « comment accéder aux champs de ucontext_t::uc_mcontext.gregs ») et un résumé au début (plutôt que de noyer dans l’historique (lequel est important mais bon, syndrome TL;DR tout ça)).)² ¹ Histoire de faire venir vendredi plus vite : la feue liste debian-french a été scindée en duf et ddf parce que les DDF voulaient pouvoir organiser leurs bouffes sans être gênés par les questions des utilisateurs. Vu le trafic sur ddf, ils ont dû mourir de faim… ² Ouais, élevé au Lisp ;oP -- Sylvain Sauvage -- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.org/fr/FrenchLists Pour vous DESABONNER, envoyez un message avec comme objet unsubscribe vers debian-user-french-requ...@lists.debian.org En cas de soucis, contactez EN ANGLAIS listmas...@lists.debian.org Archive: https://lists.debian.org/4309272.4NAhItcGmm@earendil
A propos des DD (dérivé de Re: [HS] usine à gaz des .h)
Bonjour à tous les utilisateurs et développeurs de Debian : Le lundi 30 juin 2014 à 15:26, Sylvain L. Sauvage sylvain.l.sauv...@free.fr a écrit : ¹ Histoire de faire venir vendredi plus vite : la feue liste debian-french a été scindée en duf et ddf parce que les DDF voulaient pouvoir organiser leurs bouffes sans être gênés par les questions des utilisateurs. Vu le trafic sur ddf, ils ont dû mourir de faim… Et ils sont devenus des zombies vu qu'ils continuent à s'occuper de Debian. L'un d'entre eux - Lucas N. - a même récemment rempilé pour un an à la tête de Projet Debian. Ça fait vraiment peur. o_O Attention quand même, il paraît que c'est terriblement contagieux, ces bestioles. Moi-même, j'ai peur de devenir, un jour, un DD (donc un zombie) vu que je m'intéresse plus en plus du développement de Debian. :-) Bon, je me casse ---[] Cordialement et à bientôt, Stéphane. -- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.org/fr/FrenchLists Pour vous DESABONNER, envoyez un message avec comme objet unsubscribe vers debian-user-french-requ...@lists.debian.org En cas de soucis, contactez EN ANGLAIS listmas...@lists.debian.org Archive: https://lists.debian.org/201406301626.54497.stephane.garg...@gmail.com
RE: A propos des DD (dérivé de Re: [HS] usine à gaz des .h)
On est vendredi ? -- ovd valentin@live.fr De : Stéphane GARGOLYmailto:stephane.garg...@gmail.com Envoyé : 30/06/2014 18:27 À : debian-user-french@lists.debian.orgmailto:debian-user-french@lists.debian.org Objet : A propos des DD (dérivé de Re: [HS] usine à gaz des .h) Bonjour à tous les utilisateurs et développeurs de Debian : Le lundi 30 juin 2014 à 15:26, Sylvain L. Sauvage sylvain.l.sauv...@free.fr a écrit : ¹ Histoire de faire venir vendredi plus vite : la feue liste debian-french a été scindée en duf et ddf parce que les DDF voulaient pouvoir organiser leurs bouffes sans être gênés par les questions des utilisateurs. Vu le trafic sur ddf, ils ont dû mourir de faim… Et ils sont devenus des zombies vu qu'ils continuent à s'occuper de Debian. L'un d'entre eux - Lucas N. - a même récemment rempilé pour un an à la tête de Projet Debian. Ça fait vraiment peur. o_O Attention quand même, il paraît que c'est terriblement contagieux, ces bestioles. Moi-même, j'ai peur de devenir, un jour, un DD (donc un zombie) vu que je m'intéresse plus en plus du développement de Debian. :-) Bon, je me casse ---[] Cordialement et à bientôt, Stéphane. -- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.org/fr/FrenchLists Pour vous DESABONNER, envoyez un message avec comme objet unsubscribe vers debian-user-french-requ...@lists.debian.org En cas de soucis, contactez EN ANGLAIS listmas...@lists.debian.org Archive: https://lists.debian.org/201406301626.54497.stephane.garg...@gmail.com