Bonjour,
Voila en travaillant sur le code source d'Openssl 0.9.8i (le dernier ) je me suis rendu compte qu'une de ses fonctions provoquait systématiquement un :
Erreur de segmentation: core dumped
M_ASN1_I2D_seq_total()
J'ai donc creusé un peu cette fonction en explicitant les fonctions qu'elle appelait:
entre autres la fonction:
void ASN1_put_object(unsigned char **pp, int constructed, int length, int tag, int xclass)
dans laquelle j'ai placé des balises "printf"
;-) .
<color>
void ASN1_put_object(unsigned char **pp, int constructed, int length, int tag,
int xclass)
{
unsigned char *p= *pp;
int i, ttag;
i=(constructed)?V_ASN1_CONSTRUCTED:0;
i|=(xclass&V_ASN1_PRIVATE);
if (tag < 31)
/* le problème est ici c'est *p++=un entier */
*(p++)=i|(tag&V_ASN1_PRIMITIVE_TAG);
else
{
*(p++)=i|V_ASN1_PRIMITIVE_TAG;
for(i = 0, ttag = tag; ttag > 0; i++) ttag >>=7;
ttag = i;
while(i-- > 0)
{
p[i] = tag & 0x7f;
if(i != (ttag - 1)) p[i] |= 0x80;
tag >>= 7;
}
p += ttag;
}
if (constructed == 2)
*(p++)=0x80;
else
asn1_put_length(&p,length);
*pp=p;
}
</color>
De cette manière j'ai fini par isoler le problème:
a l'exécution la sale bête qui me fait perdre mon temps est en fait une allocation d'un entier( i|V_ASN1_PRIMITIVE_TAG ) (c'est bien un entier j'ai vérifié ce bout de code marche) à l'emplacement d'un unsigned char ( *p(++) ).
pour en avoir le cœur net j'ai donc réalisé le programme suivant:
#include <stdio.h>
#include <string.h>
int main(void)
{
unsigned char *d;
*d=14;
return 1;
}
et là ça compile mais à l'exécution ça me renvoie bien un
Erreur de segmentation (core dumped)
Que pensez vous de cela? Est-ce un bug ou bien me manque-t-il une librairie?
Tout simplement peut être y a t il une autre manière de l'écrire?
Merci
Configuration: Linux
Firefox 3.0.1