IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

* stack smashing detected * (Encore et toujours ;) )


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut * stack smashing detected * (Encore et toujours ;) )
    Bonsoir à tous,

    Après une petite recherche concernant mon problème sur google et aussi sur ce forum je me suis aperçu qu'il n'existait pas une solution unique à mon problème, voila pourquoi je viens vous embêter avec (encore) ce problème.

    La compilation de mon programme avec l'option -Wall se déroule sans soucis mais dès le lancement de mon programme j'obtiens cette erreur *** stack smashing detected ***
    Le plus bizarre étant que j'ai l'impression que pour le même code (inchangé) et bien cette erreur n'apparait pas tout le temps.

    J'ai rapidement isoler la source, la fonction en question posant problème est une fonction important des fichiers textes dans la mémoire au démarrage de mon programme.
    Quand dans mon main je /*commente*/ cette ligne le programme refonctionne directement puis dès que j'enlève les commentaires op ca me refait l'erreur puis j'attends un peut et des fois sa ce remet à fonctionner tout seul.

    Voici le code en question de cette fonction, je ne peux vous fournir tout le code du programme il y à 12 fichiers différents et cette fonction n'est à elle seule qu'une partie d'un seul fichier :

    Pour info : S_Professeur, S_Matiere, S_Salle, S_Type sont des alias de structure déclaré
    dans un fichier structure.h "includé" dans le fichier contenant cette fonction. Les tableaux en question sont eux déclarer dans le main et transmit à la fonction au même endroits.

    Voici les structures pour les tailles de mes chaines de caractère, cela pourra peut être vous aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    struct Cours {			/*Definition de la structure Enseignement definissant une heure de cours dans l'emplois du temps*/
       int use;
       char matiere[15];
       char enseignant[10];
       char salle[4];
       char type[10];
     };
     
     struct Professeur{			/*Definition de la structure Professeur definissant une professeur pouvant enseigner*/
        char prenom[15];
        char nom[10];
     };
     
     struct Matiere{			/*Definition de la structure Matiere definissant une matiere pouvant etre enseignée*/
        char nom[15];
     };
     
     struct Salle{				/*Definition de la structure Salle definissant toutes les salles de l'établissement*/
       char nom[4];
     };
     
     struct Type{				/*Definition de la structure type definissant le type du cours enseigné (TD TP CM Exam Soutenance ...)*/
       char nom[10];
     };
    Le code de ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    void chargement(S_Professeur professeur[], S_Matiere matiere[], S_Salle salle[], S_Type type[], int nb_occurence[]){
     
      FILE* fichier=NULL;
      char nom[10], prenom[15];
      int i=0;
     
      fichier=fopen("prof.txt", "r"); /*Récupération ligne par ligne dans mon fichier prof.txt du nom et prénom de mes professeurs, ces derniers étant déclaré un par ligne avec un espace entre le nom et le prénom*/
      if (fichier!=NULL)
        {
          while(fscanf(fichier,"%s %s",nom,prenom)!=EOF){
    	  strcpy(professeur[i].nom,nom);
    	  strcpy(professeur[i].prenom,prenom);
    	  i++;
    	  nb_occurence[0]++; /*nb_occurence est un tableau contenant dans l'élément 0 le nombre de prof saisie dans l'élément 1 le nombre de matière etc ... que je réutilise souvent*/
          }
        }
      fclose(fichier);    
     
      i=0;
     
      fichier=fopen("matieres.txt", "r");
      if (fichier!=NULL)
        {
          while(fscanf(fichier,"%s",nom)!=EOF){
    	  strcpy(matiere[i].nom,nom);
    	  i++;
    	  nb_occurence[2]++;
          }
        }
      fclose(fichier);
     
      i=0;
     
      fichier=fopen("salles.txt", "r");
      if (fichier!=NULL)
        {
          while(fscanf(fichier,"%s",nom)!=EOF){
    	  strcpy(salle[i].nom,nom);
    	  i++;
    	  nb_occurence[1]++;
          }
        }
      fclose(fichier);
     
      i=0;
     
      fichier=fopen("type.txt", "r");
      if (fichier!=NULL)
        {
          while(fscanf(fichier,"%s",nom)!=EOF){
    	  strcpy(type[i].nom,nom);
    	  i++;
    	  nb_occurence[3]++;
          }
        }
      fclose(fichier);
     
    }
    A en croire ce qu'internet dis je cherche à écraser une adresse mémoire dans le systeme ou je n'ai pas le droit d'accéder. Mais la question est pourquoi ? J'ai relu mainte et mainte fois mon code sans trouver d'ou cela pouvais venir.

    J'espère que vous pourrez m'aider.
    Un grand merci par avance au personne prenant le temps de me lire et de me répondre.
    Bonne fêtes à vous tous.
    JC

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Je ne crois pas que le code posté soit suffisant pour faire un diagnostic.

    Il faut vérifier d'abord les conditions d'appel de la fonction et la composition des fichiers :

    1- vérifier que toutes les données lues dans les différents fichiers tiennent bien dans les buffers char nom[10], prenom[15] (y compris le zéro terminal) puis dans les buffers de destination finale (par exemple les champs salle[4] ne peuvent contenir que 3 caractères + un zéro terminal)

    2- vérifier que la taille des tableaux passés en argument sont compatibles avec le nombre d'éléments des fichiers : il n'y a aucun contrôle dans le code sur la taille des tableaux par rapport au nombre de données à stocker (la variable i).

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Quelques remarques sur tes lectures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      fichier=fopen("prof.txt", "r"); /*Récupération ligne par ligne dans mon fichier prof.txt du nom et prénom de mes professeurs, ces derniers étant déclaré un par ligne avec un espace entre le nom et le prénom*/
      if (fichier!=NULL)
        {
          while(fscanf(fichier,"%s %s",nom,prenom)!=EOF){
    	  strcpy(professeur[i].nom,nom);
    	  strcpy(professeur[i].prenom,prenom);
    	  i++;
    	  nb_occurence[0]++; /*nb_occurence est un tableau contenant dans l'élément 0 le nombre de prof saisie dans l'élément 1 le nombre de matière etc ... que je réutilise souvent*/
          }
        }
      fclose(fichier);
    fscanf peut ne pas lire les 2 entrees attendues : dans ce cas, il ne renvoie pas EOF (ce n'est pas une erreur d'acces au fichier), mais 0, ou 1 (cette fonction renvoit le nombre d'elements reellement lus).

    Tu ecrise dans professeur[i], sans te soucier de la taille du tableau passe en parametre : si ton fichier contient 20 lignes, mais que tu ne passes que 10 structures professeur, que se passe-t-il ?
    De meme, il faut que tu sois certain que le fichier contient bien des noms de mois de 9 caracteres, et des prenoms de moins de 14.

    Enfin, pour prof tu incrementes nb_occurence[0], pour matiere 2, pour salle 1, et pour type 3, dans cet ordre. Si ce n'est pas informatiquement faux, c'est probablement algorithmiquement errone : tu dis dans ton commentaire que matiere est 1...
    Conseil : arrete d'utiliser des nombres magiques, et passe par des constantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define PROF_ID 0
    #define MATI_ID 1
     
    /* utilisation */
    nb_occurence[PROF_ID]++;
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut
    C'est vraiment super bizarre, pour exemple la à l'instant je recompile le même code qu'hier auquel je n'ai rien modifié, il s'exécute bien, mes professeurs, salles, matières, types sont bien importés sans soucis et les comparaisons se font très bien, l'algo se déroule parfaitement.

    Par contre en effet pour mes tailles de chaine quand j'ai 4 je met 4 caractères ... je vais donc toutes les agrandir de 1, mais dans mes fichiers c'est un \n qui se trouve en fin de ligne du coup comment fscanf fait t'elle pour replacer ce \n par \0 afin d'éviter de me retrouver dans mes structures avec des retours à la ligne apres chaque prof ?
    Mon tableaux de professeurs fais exactement 40 cases et je n'importe que 13 structures

    Pour les nom et prénom de moins de 9 et 14 caractères c'est bien le cas, je l'ai vérifié moi même.

    Ok pour les nombres magiques, je vais mettre des constantes de suite.

    Pour faire un bon diagnostique que vous faudrait t'il ? Je peux toujours vous fournir plus de code mais je crains que cela vous soule vite ... il y en a vraiment beaucoup, cela dis je peux sélectionner les parties qui pourrait vous aider.
    Je vais faire tout ces tests d'appel à ma fonction chargement.

    Mais comment expliquer que une fois par si un fois par la il bug et d'autre pas ... Serait-ce la pile qui grandi dans ma machine et qui du coup arrive a une adresse que mon code utilise et qui du coup rend mon programme inutilisable ?

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Dans ce genre de choses, le plantage est hélas aléatoire. Parfois ça semble marcher avec des résultats justes, parfois ça semble marcher avec des résultats faux, parfois ça plante; ça semble marcher un jour et pas le lendemain ou sur une autre machine....
    quand j'ai 4 je met 4 caractères ... je vais donc toutes les agrandir de 1
    Un tel dépassement peut suffire à faire planter
    c'est un \n qui se trouve en fin de ligne du coup comment fscanf fait t'elle pour replacer ce \n par \0
    fscanf() avec le format %s considère le '\n' comme un blanc et s'arrête donc avant de le lire.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut
    Okay, je vais faire toutes ces modifications dans la soirée du coup et je vous tiens très vite au courant.

    Par contre du coup si fscanf interprète le \n comme un espace quand je fais strcpy de cette chaine dans le champ de la structure correspondante strcpy ne voit donc plus ce \n mais un \0 c'est cela ?

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Oui

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut
    Re Bonjour à tous,

    Après mainte et mainte recherche j'ai enfin trouvé d'ou cela venait !
    A cause de mes tailles de chaines de caractères trop restraintes (zappant le \0) j'avais au premier coup aucun souci la lire les champs (car bien formaté) mais quand je fermais le logiciel il sauvegardait et la d'une mauvaise facon en concaténant je ne sais pourquoi certaines valeurs et c'est une fois à la ré-ouverture du logiciel qu'en lecture je me retrouvais avec des champs beaucoup trop long !

    Un grand merci à vous tous pour votre aide, j'étais loins de penser un problème de caractère pouvait générer une erreur du genre.

Discussions similaires

  1. stack smashing detected lors d'une lecture de fichier
    Par Dave62 dans le forum Débuter
    Réponses: 5
    Dernier message: 06/11/2009, 13h50
  2. Probléme * stack smashing detected *
    Par Mat262 dans le forum Débuter
    Réponses: 13
    Dernier message: 23/12/2008, 21h34
  3. Problème de "stack smashing detected"
    Par Mr Light dans le forum C++
    Réponses: 9
    Dernier message: 29/02/2008, 09h09
  4. stack smashing detected et sscanf
    Par vinzzzz dans le forum Bibliothèque standard
    Réponses: 34
    Dernier message: 03/12/2007, 16h50
  5. "stack smashing detected" encore...
    Par incal dans le forum Débuter
    Réponses: 11
    Dernier message: 01/10/2007, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo