Re: usine à gaz des .h

2014-07-01 Par sujet Marc Mezzarobba
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

2014-06-30 Par sujet Philippe Deleval

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

2014-06-30 Par sujet Sylvain L. Sauvage
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)

2014-06-30 Par sujet Stéphane GARGOLY
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)

2014-06-30 Par sujet valentin OVD
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