Je suis en train de faire un prog. de cryptographie (rsa + sha1) et j'ai un petit soucis de mémoire il me semble.
J'ai créé une structure pouvant contenir le message à signer avec sha1 ainsi que la signature et la taille du message. Et lorsque j'initialise la signature, les instructions d'entrée/sortie qui suivent m'affichent à l'exécution des messages comme le message d'erreur ci-dessous. J'utilise gcc3.4.1.
Voici un code "épuré" qui me fournit l'erreur :
#include <stdio.h>
typedef unsigned char u8;
typedef unsigned long u32;
typedef unsigned long long u64;
typedef struct MSG{
u32 sig[5];
u64 taille;
u8 * contenu;
} * sha1_message;
int main (int argc, char **argv)
{
sha1_message msg;
FILE* file;
msg->sig[0] = 0x67452301;
file = fopen("message.txt.sig","w");
fclose(file);
return 0;
}
Et j'obtiens le message d'erreur:
lookup 0x08048000 0x000001a8 -> 0x40027000 0x000527e0 /1 fopen
Segmentation fault
Si j'enlève l'affectation de sig[0] là pas de problème...
Voili voilou si quelqu'un pouvait m'indiquer l'erreur que je fais ça serait cool parce que je ne vois pas du tout. Merci d'avance.
# Normal...
Posté par pasBill pasGates . Évalué à 4.
alloue un pointeur sur une structure de type sha1_message, il n'alloue pas la structure.
Faut allouer la structure et y affecter le pointeur(ou allouer la structure sur la stack), parce que pour l'instant dans ton code, msg c'est un pointeur dont la valeur est aleatoire (la valeur est celle presente sur la stack lors de l'appel de main(...) vu que tu ne mets pas le pointeur a NULL).
# typedef ...
Posté par Mouns (site web personnel) . Évalué à 4.
ton typedef produit un pointeur sur une struct et non une struct : donc "msg" n'est pas alloué.
[^] # Re: typedef ...
Posté par RedIsDead . Évalué à 2.
Si tu n'avais pas fait le typdef et gardé struct MSG, tu n'aurais pas fait l'erreur.
# Mouais ...
Posté par Obsidian . Évalué à 2.
Trop d'abstraction tue l'abstraction.
[^] # Re: Mouais ...
Posté par cabugs . Évalué à 1.
C'est que j'ai vu plusieurs cours contenir de telles constructions comme le dit Robin des Bulles, et je pensais donc que c'était une bonne façon de faire.
Je pensais qu'avec la seule déclaration il allouait la mémoire pour la structure...
J'ai en effet vu qu'en ajoutant juste l'allocation :
msg = (sha1_message) malloc(sizeof(struct MSG));
je n'ai plus de problème.
Mais comme vous me dites que ce n'est pas une façon propre de procéder je vais réécrire un peu tout ça.
Encore merci
[^] # Re: Mouais ...
Posté par Mouns (site web personnel) . Évalué à 4.
typedef struct { int coin; char pan[5]; } coinpan;
typedef coinpan * coinpan_ptr;
apres faut voir le debat entre les hungarian et clarkian pour la notation.
puis pense au controle de retour de malloc ... c rigolo comme fonction.
pense a faire les free() aussi ... sinon fuite memoire.
pense aussi que calculer le checksum d'un fichier de 80Go ne se fait pas en copiant le fichier en RAM ...
conseil : ne publie en aucun cas ton code et ne le reutilise jamais, je sens qu'il est deja bourré de faille de sécu et de bugs avant meme d'etre ecrit ;)
[^] # Re: Mouais ...
Posté par alf . Évalué à 1.
+1
Et pense aussi à ne pas caster le retour de *alloc()... En C++, c'est une habitude (et même obligatoire, il me semble, je ne connais pas trop le C++) mais, en C, c'est non seulement inutile, mais dangereux (peut cacher le fait que stdlib n'est pas inclus).
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.