Forum Programmation.c segmentation fault sur instructions d'entrée/sortie

Posté par  .
Étiquettes : aucune
0
29
nov.
2005
Bonjour à tous

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  . Évalué à 4.

    sha1_message msg;

    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  (site web personnel) . Évalué à 4.

    j'avoue que ton typedef a une sale gueule.

    ton typedef produit un pointeur sur une struct et non une struct : donc "msg" n'est pas alloué.
    • [^] # Re: typedef ...

      Posté par  . Évalué à 2.

      Je dirais meme que ton typedef est dangereux, il masque une structure et il masque aussi un pointeur.
      Si tu n'avais pas fait le typdef et gardé struct MSG, tu n'aurais pas fait l'erreur.
  • # Mouais ...

    Posté par  . Évalué à 2.

    J'ai un prof d'algo qui nous fait faire le même genre de bêtise. Il faudrait qu'ils redescendent un peu sur terre et qu'ils se rendent compte qu'il arrive un moment où il faut implémenter toute cette belle théorie.

    Trop d'abstraction tue l'abstraction.
    • [^] # Re: Mouais ...

      Posté par  . Évalué à 1.

      Merci à tous pour vos indications.
      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  (site web personnel) . Évalué à 4.

        pour ton histoire de typedef, il est preferable de faire:

        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  . Évalué à 1.

          puis pense au controle de retour de malloc ... c rigolo comme fonction.

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