SIGBUS

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Marc Boyer
Le #23513961
Le 28-06-2011, 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
)



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
JKB
Le #23514021
Le Wed, 29 Jun 2011 13:57:38 +0000 (UTC),
Marc Boyer
Le 28-06-2011, 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
)



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
Marc Boyer
Le #23514111
Le 29-06-2011, JKB
Le Wed, 29 Jun 2011 13:57:38 +0000 (UTC),
Marc Boyer
Le 28-06-2011, 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
)



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
JKB
Le #23514481
Le Wed, 29 Jun 2011 14:51:22 +0000 (UTC),
Marc Boyer
Le 29-06-2011, JKB
Le Wed, 29 Jun 2011 13:57:38 +0000 (UTC),
Marc Boyer
Le 28-06-2011, 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
)



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
Marc Boyer
Le #23514541
Le 29-06-2011, JKB
Le Wed, 29 Jun 2011 14:51:22 +0000 (UTC),
Marc Boyer
Le 29-06-2011, JKB
Le Wed, 29 Jun 2011 13:57:38 +0000 (UTC),
Marc Boyer
Le 28-06-2011, JKB
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
JKB
Le #23514631
Le Wed, 29 Jun 2011 16:04:04 +0000 (UTC),
Marc Boyer
Le 29-06-2011, JKB
Le Wed, 29 Jun 2011 14:51:22 +0000 (UTC),
Marc Boyer
Le 29-06-2011, JKB
Le Wed, 29 Jun 2011 13:57:38 +0000 (UTC),
Marc Boyer
Le 28-06-2011, JKB
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
Lucas Levrel
Le #23515291
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
JKB
Le #23515411
Le Wed, 29 Jun 2011 21:29:55 +0200,
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) ?



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
Marc Boyer
Le #23516881
Le 29-06-2011, JKB
Le Wed, 29 Jun 2011 16:04:04 +0000 (UTC),
Marc Boyer
Le 29-06-2011, JKB
Le Wed, 29 Jun 2011 14:51:22 +0000 (UTC),
Marc Boyer
Le 29-06-2011, JKB
Le Wed, 29 Jun 2011 13:57:38 +0000 (UTC),
Marc Boyer
Le 28-06-2011, JKB
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
JKB
Le #23516941
Le Thu, 30 Jun 2011 08:13:36 +0000 (UTC),
Marc Boyer
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
Publicité
Poster une réponse
Anonyme