Core dumped avec un char= entier dans Openssl
Résolu
Cyrard
-
Cyrard Messages postés 1 Date d'inscription Statut Membre Dernière intervention -
Cyrard Messages postés 1 Date d'inscription Statut Membre Dernière intervention -
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 :
J'ai donc creusé un peu cette fonction en explicitant les fonctions qu'elle appelait:
entre autres la fonction:
;-) .
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:
et là ça compile mais à l'exécution ça me renvoie bien un
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
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
A voir également:
- Core dumped avec un char= entier dans Openssl
- Open core legacy patcher - Accueil - MacOS
- Core temp - Télécharger - Divers Utilitaires
- Core ftp - Télécharger - Téléchargement & Transfert
- Coco char - Accueil - Réseaux sociaux
- Impossible de générer de clé privée à partir de openssl_pkey_new. vérifiez votre configuration openssl. le problème peut être lié au chemin vers openssl.cafile. ✓ - Forum Webmastering
7 réponses
hello
c'est normal,* d est un pointeur qui ne pointe sur rien, donc *d=14; est illégal
char a;
char *d=&a;
*d=14;
*d pointe sur a qui est un char
c'est normal,* d est un pointeur qui ne pointe sur rien, donc *d=14; est illégal
char a;
char *d=&a;
*d=14;
*d pointe sur a qui est un char
Bon, en fait, l'assignation à la déclaration est différente de l'assignation :
char a='0';
char *d=&a;
mais :
d=&a;
De même : char * d="essai";d="autre string";
"abc" est une constante de type 'const char *' où tu peux faire pointé d.
Dans ces cas là, l'erreur viens souvent du fait que tu déborde du tableau. vérifie par un accès (printf(*p)) que tu est bien dans un domaine mémoire autorisé.
char a='0';
char *d=&a;
mais :
d=&a;
De même : char * d="essai";d="autre string";
"abc" est une constante de type 'const char *' où tu peux faire pointé d.
Dans ces cas là, l'erreur viens souvent du fait que tu déborde du tableau. vérifie par un accès (printf(*p)) que tu est bien dans un domaine mémoire autorisé.
Ok merci a tous .
Ca marche maintenant.
En effet le probleme venait du fait que le pointeur n'était pas mallocé. (il pointait sur une string assez grande)
Merci encore pour vos explications!
Ca marche maintenant.
En effet le probleme venait du fait que le pointeur n'était pas mallocé. (il pointait sur une string assez grande)
Merci encore pour vos explications!
Personne n'a d'idée?
Je me suis mal exprimé je pense.
En fait je me demande si ce n'est pas un bug carrément dans openssl.
Mais que pensez vous seulement de ce genre de chose:
Un unsigned char: *d = un entier ça provoque un core dumped. Mais si j'écris un unsigned char a = un entier (sans l'étoile) ,là ça marche! Pourtant ça devrait être la même chose? Non?
Je me suis mal exprimé je pense.
En fait je me demande si ce n'est pas un bug carrément dans openssl.
Mais que pensez vous seulement de ce genre de chose:
Un unsigned char: *d = un entier ça provoque un core dumped. Mais si j'écris un unsigned char a = un entier (sans l'étoile) ,là ça marche! Pourtant ça devrait être la même chose? Non?
#include <stdio.h> #include <string.h> int main(void) { unsigned char *d; *d=14; return 1; }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Oulah je ne suis pas sûr de bien comprendre:
*d est un pointeur?
Moi je pensais que : d est un pointeur sur un char
*d est un char
ton code fonctionne en effet mais par rapport au code openssl (je n'ai remis que le début) comment pourrait on le modifier pour qu'il marche normalement? Je ne le comprend pas en integralite...
*d est un pointeur?
Moi je pensais que : d est un pointeur sur un char
*d est un char
ton code fonctionne en effet mais par rapport au code openssl (je n'ai remis que le début) comment pourrait on le modifier pour qu'il marche normalement? Je ne le comprend pas en integralite...
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) *(p++)=i|(tag&V_ASN1_PRIMITIVE_TAG);
Tu es sur que cest pas plutot : d=&a ?
Car d est le pointeur est *d est la variable pointee cad un char ici.
Car d est le pointeur est *d est la variable pointee cad un char ici.
Oups autant pour moi, j'annule mon message précèdent. Ça revient au meme.Mais bon au final tu initialise ton pointeur sur l'adresse de a qui est un char. Mais que se passe t il quand tu lui attribue la valeur 14?
*d=14; ça revient a faire: a=14; non?
Donc dans ce cas dans ma fonction ils ont essayer de mettre un caractere = un entier>9...
Quand j'essaie d'afficher a ça n'affiche rien...
*d=14; ça revient a faire: a=14; non?
Donc dans ce cas dans ma fonction ils ont essayer de mettre un caractere = un entier>9...
Quand j'essaie d'afficher a ça n'affiche rien...
#include <stdio.h> #include <string.h> int main(void) { unsigned char a; unsigned char *d; d=&a; *d=14; if(*d==a) printf("%s\n","*d==a"); printf("%c\n",a); printf("%x\n",d); return 1; }