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 Abandon (ubuntu) Erreur 5 sur DevC++


Sujet :

C

  1. #1
    Membre à l'essai
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2014
    Messages : 4
    Points : 15
    Points
    15
    Par défaut stack smashing detected Abandon (ubuntu) Erreur 5 sur DevC++
    Bonjour

    Je débute en programmation C et en informatique tout court.

    Je suis en train de créer un petit programme de gestion de location et code la partie qui concerne les clients, fournisseurs et propriétaires. J'ai commencé par coder la procédure de chargement de mes fichiers texte. A la compilation pas de problème mais à l'exécution...c'est le drame!!!
    - sur ubuntu j'ai le message "stack smashing detected Abandon " et rien ne se passe
    - sur DevC++, au bout d'un temps assez long j'ai une fenêtre erreur ci-dessous mais ca s'exécute pas comme je veux mais ca tourne.

    ---------
    Platform : Windows NT
    OS version : version 6.1 (build 7601)
    Additional info: Service Pack 1


    The following error occured in version 4.9.9.2:
    System Error. Code: 5.
    Accès refusé (at address 0x0040F0EE)


    Please include a description of what you were doing before the error occured (please give as much precisions as possible) :


    State information follows:
    Stack trace:
    ------------
    0058F80A (0018E80A): ShowExceptionInfo (ExceptionsAnalyzer - 566)
    0058F9FF (0018E9FF): TExceptionsAnalyzer.GlobalExceptionHandler (ExceptionsAnalyzer - 574)
    00589832 (00188832): TEditor.EditorHintTimer (editor - 1393)
    0059105B (0019005B): (devcpp - 230)
    00591079 (00190079): (devcpp - 230)

    Voici mon code en C
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
    #include <stdio.h>
    #include <string.h>
     
    #define MAX_PERSONNE 500
    #define PERSONNE_NON_TROUVE -1
    #define FICHIERF "fournisseur.txt"
    #define FICHIERA "proprio.txt"
    #define FICHIERC "client.txt"
     
    struct personne{
    	char code[1] 		; //A pour proprio, F pour fournisseur et C pour client 	
    	char num[5]		; // identifiant Ã* 4 chiffre en autoincrementation
    	char nom[100]		; //commun Ã* Client, Fournisseur et proprio
    	char prenom[100]	;
    	char telFixe[13]	; 	
    	char telPort[13]	; 	
    	char mail[100] 		;
    	char adrs[500]    	;
    	char entreprise[100]	; // pour proprio et fournisseur
    	char sireten[14] 	; // SIRET 14 chiffres et SIREN 9 chiffres  - pour proprio et fournisseur
    	char TCnil[7] 		; // Ce qui commence par T (pour Tag) est spécifique au propriétaire
    	char TRest[50]		; // numero de petite licence restaurant composition indéterminée
    	char TAdher[12] 	; // numero d'adhérent au réseau Eco-Gite YYYYMMDDNNNN
    	char TQualifEnv[13] 	; // numero de la qualif. Environnementale XYYYYMMDDNNNN - type de qualif concaténer au num_adher
    };
     
    int nbproprio=1		;	//la ligne 0 contient les noms des variables
    int nbfournisseur=1	;
    int nbclient=1		;
     
    struct personne tab_proprio[MAX_PERSONNE]	;
    struct personne tab_fournisseur[MAX_PERSONNE]	;
    struct personne tab_client[MAX_PERSONNE]	;
     
    void chargerTabPersonne(char NomFile[50], int nbpersonne) ; 
     
     
    main()
    {
     struct personne individu;
     int choix = -1;
     while(choix!=0)
     {
              printf("- 1 - Saisie\n")                                ;
              printf("- 2 - Affichage\n")                             ;   
              printf("- 3 - Sauvegarde\n")                            ;
              printf("- 4 - Charger un fichier\n")                    ;
              printf("- 5 - Rechercher\n")                            ;
              printf("- 6 - modifier\n")                              ;
              printf("- 0 - Quitter\n")                               ;
     
              scanf("%d",&choix)                                      ;
     
              switch(choix)                                      
               {
                case 1: printf("test saisie()\n")                        ;
                     break                                                ;
                case 2: printf("test affichage()\n")                     ;
                     break                                                ;
                case 3: printf("test sauvgarder()\n")                    ;
                     break                                                ;
                case 4: printf("test charger()\n")                       ;
    		 chargerTabPersonne(FICHIERF, nbfournisseur)	;
                     break                                                ;
                case 5: printf("test rechercher()\n")                    ;
                     break                                                ;
                case 6: printf("test modifier()\n")                      ;
                     break                                                ;
                case 0: printf("Vous avez choisi de quitter cette rubrique.\n")              ;
                     break                                                                   ;
                default: printf("Erreur de saisie\n")                                        ;
                     break                                                                   ;
               }
     
     }
    }
     
    void chargerTabPersonne(char NomFile[50], int nbpersonne) //char nomfichier[],
    {
     FILE *entree		;
     struct personne temp	;
     int test 		;
     
     //char NomFile[50]	;
     
     
     entree=fopen(NomFile,"r");	
     if(entree==NULL)
     {
    	printf("Acces au fichier %s impossible\n", NomFile);
    	printf("coucou1_pbmaccesfichier\n");
     }
     else
     {
      while((! feof(entree)) && (nbpersonne<MAX_PERSONNE))
       {
     printf("coucou2_while\n");
       test=fscanf(entree,"%s %s %s %s %s %s %s %s %s %s %s %s %s", temp.code, temp.num, temp.prenom, temp.telFixe, temp.telPort, temp.mail, temp.adrs, temp.entreprise, temp.sireten, temp.TCnil, temp.TRest, temp.TAdher, temp.TQualifEnv);
    	if(test != EOF)
    	{
     
    	 if(temp.code[0]=='P')
    	  {
    		tab_proprio[nbproprio++]= temp		;
    		printf("coucou3_tabproprio\n");
    	   }
    	 if(temp.code[0]=='F')
    	  {
    		tab_fournisseur[nbfournisseur++]= temp	;
    		printf("coucou4_tabfourn\n");
    	   }
    	if(temp.code[0]=='C')
    	  {
    		tab_client[nbclient++]= temp		;
    		printf("coucou5_tabclient\n");
    	   }
       	}
       }
     }
     fclose(entree)						;
     printf("coucou6_fichier_fermer\n");
    }
    J'ai fait des recherche sur stack smashing mais je n'arrive pas à comprendre ce qui coince sur ubuntu. Si quelqu'un peu me débloquer.

    Merci à tous!

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Traduction de "stack smashing": Tu as un buffer sur la pile (donc, un buffer en variable locale d'une fonction) et tu écris plus loin que la fin de ce buffer.
    Par exemple, quelque part du dépasses d'un des buffers de ta structure personne. Ce qui n'a rien d'étonnant, vu que tu fais des scanf("%s") sans préciser de taille max, etc.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2014
    Messages : 4
    Points : 15
    Points
    15
    Par défaut Merci :)
    Merci

    Je viens de voir ton message. J'avais effectivement fini par trouver la solution. Mais, il faut reconnaître qu'une explication claire supplémentaire ne nuit pas à la débutante que je suis.

  4. #4
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Le "stack smashing protection" que tu vois est une protection rajoutée par les compilateurs modernes pour se prémunir contre les failles de type "buffer overflow" (débordement de pile en bon françois ), qui permet à un attaquant de prendre le contrôle de ton programme en injectant des données trop longues pour le tampon censé les contenir et qui va par le fait écraser tout ce qu'il y a derrière. Du coup ça mène à une corruption des données qui peut mener un attaquant à faire exécuter le code de son choix par le programme "victime"

    La protection en question consiste du coup à insérer un "cookie" aléatoire sur la pile (là où sont sauvegardées les variables locales de ta fonction) avant que ton code soit exécuté, et ensuite vérifier que la valeur du "cookie" n'a pas changé une fois sorti de la fonction, et tuer le processus le plus tôt possible le cas échéant (si la valeur du cookie change, c'est que ça a débordé du coup on considère le programme comme "compromis" et on le bute le plus rapidement possible ).

    En espérant que ça réponde à tes interrogations, hésite pas à demander plus de détails

    Bref scanf("%s") est à bannir, il faut au minimum préciser une taille max, ou mieux se tourner vers fgets qui oblige à limiter la taille de l'entrée (par contre risque d'introduire d'autres vulnérabilités avec la gestion du "null byte" qui peut déborder du tampon )
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

+ Répondre à la discussion
Cette discussion est résolue.

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