Rechercher : dans
Par :

Core dumped avec un char= entier dans Openssl

Dernière réponse le 24 oct 2008 à 10:22:07 Cyrard, le 22 oct 2008 à 21:25:54 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « Core dumped avec un char= entier dans Openssl » dans :
Correcteurs d'orthographe gratuits VoirCorrecteur orthographique intégré aux logiciels de traitement de texte Correcteurs d'orthographe gratuits sur internet Les correcteurs orthographiques existent sur plusieurs supports : soit intégré à un traitement de texte (Word, Open...
Remettre/enlever la corbeille de Vista VoirLa question revient souvent : comment réactiver la corbeille sous Vista ? La réponse est ici : il suffit de faire clic droit sur le bureau->personnaliser->cliquer sur changer les icônes du bureau->et de cocher ou décocher "corbeille".
[Windows/Corbeille] Supprimer la corbeille du bureau VoirPar défaut la corbeille apparaît sur le bureau. En cliquant avec le bouton droit sur la Corbeille aucune option de suppression n'est disponible. Windows XP Cliquer sur Démarrer > Exécuter, puis taper gpedit.msc Ensuite dans Configuration...
UML - Modélisation des classes et objets VoirModélisation d'un objet La modélisation objet consiste à créer une représentation abstraite, sous forme d'objets, d'entités ayant une existence matérielle (arbre, personne, téléphone, ...) ou bien virtuelle (sécurité sociale, compte bancaire,...
Déclaration d'entités dans les DTD VoirDéclarer des entités XML permet de créer des entités, c'est-à-dire de déclarer un groupe d'éléments sous un nom afin de ne pas avoir à réécrire ces derniers plusieurs fois dans la DTD s'ils se répètent, dans le même esprit que les macros dans les...

1

Cyrard, le 23 oct 2008 à 10:02:15

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?

#include <stdio.h>
#include <string.h>

int main(void)
{
unsigned char *d;
*d=14;
return 1;
}


Répondre à Cyrard

2

dubcek, le 23 oct 2008 à 10:07:08
  • +1

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

Répondre à dubcek

3

Cyrard, le 23 oct 2008 à 11:29:44

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...

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);

Répondre à Cyrard

4

Cyrard, le 23 oct 2008 à 11:45:43

Tu es sur que cest pas plutot : d=&a ?
Car d est le pointeur est *d est la variable pointee cad un char ici.

Répondre à Cyrard

6

dubcek, le 23 oct 2008 à 12:05:08
  • +1

Non, char d=&a est faux , il faut définir d comme un pointeur *d.

Répondre à dubcek

5

Cyrard, le 23 oct 2008 à 12:02:49

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...

#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;

}

Répondre à Cyrard

7

Char Snipeur, le 23 oct 2008 à 12:35:13
  • +1

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é. Salutation !  avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

8

 Cyrard, le 24 oct 2008 à 10:22:07
  • +1

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!

Répondre à Cyrard
Collection CommentÇaMarche.net