Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

SIGBUS

10 réponses
Avatar
JKB
Bonjour à tous,

J'essaie de compiler giac 0.9.1 sur un serveur sparc et j'ai
quelques minus problèmes d'alignement.

Le programme se vautre sur :

if (e.type>_DOUBLE_ && e.type!=_FLOAT_
#ifndef SMARTPTR64
&& e.type!=_FUNC
#endif
)

e est une classe appelée gen qui est définie comme ceci :

class gen {
public:
unsigned char type; // see dispatch.h
char subtype;
unsigned short reserved;
...
}

Lorsque ça plante, gdb me donne :

(gdb) print e
$1 = (const giac::gen &) @0xffffd9c4
...
(gdb) print _DOUBLE_
$2 = giac::_DOUBLE_

_DOUBLE_ est issu d'un enum tout bête, donc a priori un int. Les
opérateurs ne semblent pas surchargés.

Le code assembleur fautif est :
=> 0x0043510c <+44>: ldd [ %o1 ], %g2

avec %o1, un pointeur vers FFFFD974 et %g2, la valeur 0x1. ldd charge un
double mot qui n'est pas aligné sur 64 bits, donc c'est un peu
normal que le processeur râle.

J'ai essayé de forcer l'alignement du champ type de la classe gen
sans succès (parce qu'on compare tout de même un unsigned char à un
enum). Le résultat est le même.

Une idée ?

Cordialement,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr

10 réponses

Avatar
Marc Boyer
Le 28-06-2011, JKB a écrit :
Bonjour à tous,

J'essaie de compiler giac 0.9.1 sur un serveur sparc et j'ai
quelques minus problèmes d'alignement.

Le programme se vautre sur :

if (e.type>_DOUBLE_ && e.type!=_FLOAT_
#ifndef SMARTPTR64
&& e.type!=_FUNC
#endif
)



Juste pour te montrer que tu es lu: as-tu essayé de décomposer
accès et comparaison:

unsigned char etype= e.type;
if (etype>_DOUBLE_ && etype!=_FLOAT_
#ifndef SMARTPTR64
&& etype!=_FUNC
#endif
)

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Avatar
JKB
Le Wed, 29 Jun 2011 13:57:38 +0000 (UTC),
Marc Boyer écrivait :
Le 28-06-2011, JKB a écrit :
Bonjour à tous,

J'essaie de compiler giac 0.9.1 sur un serveur sparc et j'ai
quelques minus problèmes d'alignement.

Le programme se vautre sur :

if (e.type>_DOUBLE_ && e.type!=_FLOAT_
#ifndef SMARTPTR64
&& e.type!=_FUNC
#endif
)



Juste pour te montrer que tu es lu: as-tu essayé de décomposer
accès et comparaison:

unsigned char etype= e.type;
if (etype>_DOUBLE_ && etype!=_FLOAT_
#ifndef SMARTPTR64
&& etype!=_FUNC
#endif
)



Merci, j'ai oublié de dire que c'était la première chose que j'avais
testée... Sans succès d'ailleurs.

Cordialement,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Marc Boyer
Le 29-06-2011, JKB a écrit :
Le Wed, 29 Jun 2011 13:57:38 +0000 (UTC),
Marc Boyer écrivait :
Le 28-06-2011, JKB a écrit :
Bonjour à tous,

J'essaie de compiler giac 0.9.1 sur un serveur sparc et j'ai
quelques minus problèmes d'alignement.

Le programme se vautre sur :

if (e.type>_DOUBLE_ && e.type!=_FLOAT_
#ifndef SMARTPTR64
&& e.type!=_FUNC
#endif
)



Juste pour te montrer que tu es lu: as-tu essayé de décomposer
accès et comparaison:

unsigned char etype= e.type;
if (etype>_DOUBLE_ && etype!=_FLOAT_
#ifndef SMARTPTR64
&& etype!=_FUNC
#endif
)



Merci, j'ai oublié de dire que c'était la première chose que j'avais
testée... Sans succès d'ailleurs.



C'est en effet la première chose qui vient à l'esprit. Quand tu dis
"sans succès", cela signifie que le SIGBUS reste (et on peut innocenter
la classe gen), ou qu'il disparait ?

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Avatar
JKB
Le Wed, 29 Jun 2011 14:51:22 +0000 (UTC),
Marc Boyer écrivait :
Le 29-06-2011, JKB a écrit :
Le Wed, 29 Jun 2011 13:57:38 +0000 (UTC),
Marc Boyer écrivait :
Le 28-06-2011, JKB a écrit :
Bonjour à tous,

J'essaie de compiler giac 0.9.1 sur un serveur sparc et j'ai
quelques minus problèmes d'alignement.

Le programme se vautre sur :

if (e.type>_DOUBLE_ && e.type!=_FLOAT_
#ifndef SMARTPTR64
&& e.type!=_FUNC
#endif
)



Juste pour te montrer que tu es lu: as-tu essayé de décomposer
accès et comparaison:

unsigned char etype= e.type;
if (etype>_DOUBLE_ && etype!=_FLOAT_
#ifndef SMARTPTR64
&& etype!=_FUNC
#endif
)



Merci, j'ai oublié de dire que c'était la première chose que j'avais
testée... Sans succès d'ailleurs.



C'est en effet la première chose qui vient à l'esprit. Quand tu dis
"sans succès", cela signifie que le SIGBUS reste (et on peut innocenter
la classe gen), ou qu'il disparait ?



Il reste... En fait, j'ai copié toutes les valeurs dans des
variables intermédiaires de même type et le sigbus est levé lors de
la première comparaison (de deux variables de même type). Je ne vois
vraiment pas où je pourrais avoir un problème d'alignement.

Cordialement,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Marc Boyer
Le 29-06-2011, JKB a écrit :
Le Wed, 29 Jun 2011 14:51:22 +0000 (UTC),
Marc Boyer écrivait :
Le 29-06-2011, JKB a écrit :
Le Wed, 29 Jun 2011 13:57:38 +0000 (UTC),
Marc Boyer écrivait :
Le 28-06-2011, JKB a écrit :

Juste pour te montrer que tu es lu: as-tu essayé de décomposer
accès et comparaison:

unsigned char etype= e.type;
if (etype>_DOUBLE_ && etype!=_FLOAT_
#ifndef SMARTPTR64
&& etype!=_FUNC
#endif
)



Merci, j'ai oublié de dire que c'était la première chose que j'avais
testée... Sans succès d'ailleurs.



C'est en effet la première chose qui vient à l'esprit. Quand tu dis
"sans succès", cela signifie que le SIGBUS reste (et on peut innocenter
la classe gen), ou qu'il disparait ?



Il reste... En fait, j'ai copié toutes les valeurs dans des
variables intermédiaires de même type et le sigbus est levé lors de
la première comparaison (de deux variables de même type). Je ne vois
vraiment pas où je pourrais avoir un problème d'alignement.



Et le _DOUBLE_, c'est aussi un unsigned char ?
T'as aussi tenté de décomposer le test ?
const bool eSupD= etype > _DOUBLE_ ?

Marc boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Avatar
JKB
Le Wed, 29 Jun 2011 16:04:04 +0000 (UTC),
Marc Boyer écrivait :
Le 29-06-2011, JKB a écrit :
Le Wed, 29 Jun 2011 14:51:22 +0000 (UTC),
Marc Boyer écrivait :
Le 29-06-2011, JKB a écrit :
Le Wed, 29 Jun 2011 13:57:38 +0000 (UTC),
Marc Boyer écrivait :
Le 28-06-2011, JKB a écrit :

Juste pour te montrer que tu es lu: as-tu essayé de décomposer
accès et comparaison:

unsigned char etype= e.type;
if (etype>_DOUBLE_ && etype!=_FLOAT_
#ifndef SMARTPTR64
&& etype!=_FUNC
#endif
)



Merci, j'ai oublié de dire que c'était la première chose que j'avais
testée... Sans succès d'ailleurs.



C'est en effet la première chose qui vient à l'esprit. Quand tu dis
"sans succès", cela signifie que le SIGBUS reste (et on peut innocenter
la classe gen), ou qu'il disparait ?



Il reste... En fait, j'ai copié toutes les valeurs dans des
variables intermédiaires de même type et le sigbus est levé lors de
la première comparaison (de deux variables de même type). Je ne vois
vraiment pas où je pourrais avoir un problème d'alignement.



Et le _DOUBLE_, c'est aussi un unsigned char ?
T'as aussi tenté de décomposer le test ?
const bool eSupD= etype > _DOUBLE_ ?



Non, le _DOUBLE_, c'est un enum, donc a priori un int. Mais ce
n'est pas une histoire de type parce que si je remplace le unsigned
char par un int (voir un enum), je récupère toujours mon sigbus.

Cordialement,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Lucas Levrel
Le 28 juin 2011, JKB a écrit :

J'ai essayé de forcer l'alignement du champ type de la classe gen



As-tu essayé de forcer l'alignement de e lui-même (si c'est possible) ?

--
LL
Avatar
JKB
Le Wed, 29 Jun 2011 21:29:55 +0200,
Lucas Levrel écrivait :
Le 28 juin 2011, JKB a écrit :

J'ai essayé de forcer l'alignement du champ type de la classe gen



As-tu essayé de forcer l'alignement de e lui-même (si c'est possible) ?



Non, mais e est aligné. J'ai vérifié. Et si e ne l'était pas, ça
coincerait ailleurs que dans la comparaison lorsque l'on passe par
des variables intermédiaires.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Marc Boyer
Le 29-06-2011, JKB a écrit :
Le Wed, 29 Jun 2011 16:04:04 +0000 (UTC),
Marc Boyer écrivait :
Le 29-06-2011, JKB a écrit :
Le Wed, 29 Jun 2011 14:51:22 +0000 (UTC),
Marc Boyer écrivait :
Le 29-06-2011, JKB a écrit :
Le Wed, 29 Jun 2011 13:57:38 +0000 (UTC),
Marc Boyer écrivait :
Le 28-06-2011, JKB a écrit :

Juste pour te montrer que tu es lu: as-tu essayé de décomposer
accès et comparaison:

unsigned char etype= e.type;
if (etype>_DOUBLE_ && etype!=_FLOAT_
#ifndef SMARTPTR64
&& etype!=_FUNC
#endif
)



Merci, j'ai oublié de dire que c'était la première chose que j'avais
testée... Sans succès d'ailleurs.



C'est en effet la première chose qui vient à l'esprit. Quand tu dis
"sans succès", cela signifie que le SIGBUS reste (et on peut innocenter
la classe gen), ou qu'il disparait ?



Il reste... En fait, j'ai copié toutes les valeurs dans des
variables intermédiaires de même type et le sigbus est levé lors de
la première comparaison (de deux variables de même type). Je ne vois
vraiment pas où je pourrais avoir un problème d'alignement.



Et le _DOUBLE_, c'est aussi un unsigned char ?
T'as aussi tenté de décomposer le test ?
const bool eSupD= etype > _DOUBLE_ ?



Non, le _DOUBLE_, c'est un enum, donc a priori un int. Mais ce
n'est pas une histoire de type parce que si je remplace le unsigned
char par un int (voir un enum), je récupère toujours mon sigbus.



Oui, m'enfin bon, vu le niveau de bizarrerie du bug, je me méfierais de tout.
const unsigned char etype= e.type;
const int localDouble= _DOUBLE_;
const bool eSupD= etype > localDouble ;
if ( eSupD ){
const int localFloat= _FLOAT_ ;
const bool eDiffF= etype != _FLOAT_ ;
if ( eDiffF ) {
... etc
}
}

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Avatar
JKB
Le Thu, 30 Jun 2011 08:13:36 +0000 (UTC),
Marc Boyer écrivait :
Oui, m'enfin bon, vu le niveau de bizarrerie du bug, je me méfierais de tout.
const unsigned char etype= e.type;
const int localDouble= _DOUBLE_;
const bool eSupD= etype > localDouble ;
if ( eSupD ){
const int localFloat= _FLOAT_ ;
const bool eDiffF= etype != _FLOAT_ ;
if ( eDiffF ) {
... etc
}
}



Le concepteur du bug est en train de regarder ce qui se passe. Je
passerai pas ici avec la solution. Il paraît que c'est une
histoire d'optimisation de code. Enfin, des optimisations qui lèvent
un SIGBUS, ça ne doit pas être très propre ;-)

Cordialement,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr