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

Bibliothèque standard C Discussion :

stack smashing detected et sscanf


Sujet :

Bibliothèque standard C

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut stack smashing detected et sscanf
    Hello,

    J'ai cette superbe erreur qui apparait lors de l'execution de mon programme. Voici le bout de code a prioris concerné (réduit au minimum vital):

    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
     
    int add_list_data(char *str_list_file, s_params *par) 
    {
    	FILE *f;
    	int n,
    	     nread = 0,
    	     status ;
     
    	char buf[150],
    		apobuf[10],
    		ligbuf[50],
    		complexbuf[50];
     
    	f = fopen(str_list_file, "r") ;
    	if(f) {
    		while(fgets(buf, 150, f)) {
    			n = par->nfiles ;
    			status = sscanf(buf, "%s %s %s", apobuf, complexbuf, ligbuf) ;
     
    			if(status == 3) {
    				nread += add_prot(apobuf, complexbuf, ligbuf, par) ;
    			}
    		}
    	}
     
            // FLAG
    	return(nread) ;
    }
    Voila en gros, le code s'arrete au FLAG, dans le sens ou je fait un printf avant le return ca fonctionne, mais dés que je retourne dans ma fonction appelante ca plante. Il termine donc correctement tout ce qu'il y a avant (a prioris).

    En enlevant le sscanf, plus aucun problème. J'en ai déduit que ca venait donc du sscanf. Or je ne comprends pas pourquoi: tous mes buffers sont largements assez grands pour contenir mes diverses lectures (fichiers et colonnes). Bref je n'ai aucun problème, en théorie, de dépassement: Mon fichier de test contiens trois lignes ayant trois colonnes de chacunes exactement 5 caractères).

    Voila si quelqu'un a une idée...
    Merci d'avance

  2. #2
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    tous mes buffers sont largements assez grands
    N'oublie pas que pour chaque buffer le \0 final est rajouté.

  3. #3
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    salut

    peut-être qu'on pourrait t'aider si tu postais le code en entier ?

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Ben le code en entier serait bien trop énorme...

    Par ailleurs je sais bien que le \0 y est ajouté. D'ailleurs, j'affiche a la fin de la fonction (juste avant que ca plante) ma structure qui contiens les informations que j'ai récupéré dans le fichiers, et elles sont bien là... La structure est la suivante (je sais pas si ca peut vs etre utile...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef struct s_params
    {
    	char **fapo,
    		 **fcomplex,
    		 **fligan ;
     
    	int nfiles ;
     
    	float ashape_min_size,	
    		  ashape_max_size ;	
     
    } s_params ;
    Ainsi la fonction add_prot ne fait qu'ajouter les 3 chaines de caractères trouvées dans les tableaux fapo, fcomplex, fligan... Donc quelques allocations rien de bien dangereux.

  5. #5
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Donc quelques allocations rien de bien dangereux.
    Si la preuve

  6. #6
    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
    Ainsi la fonction add_prot ne fait qu'ajouter les 3 chaines de caractères trouvées dans les tableaux fapo, fcomplex, fligan... Donc quelques allocations rien de bien dangereux.
    Vu les déclarations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct s_params
    {
    	char **fapo,
    		 **fcomplex,
    		 **fligan ;
    ....
    il vaudrait le coup de voir le code de add_prot

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Allons y alors:

    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
     
    int add_prot(char *apo, char *complex, char *ligan, s_params *par) 
    {
    	FILE *f = fopen(apo, "r") ;
    	int nm1 ;
    	if(f) {
    		fclose(f) ;
    		f = fopen(complex, "r") ;
    		if(f) {
    			nm1 = par->nfiles ;
    			par->nfiles += 1 ;
    			par->fapo     = (char**) my_realloc(par->fapo, (par->nfiles)*sizeof(char*)) ;
    			par->fligan   = (char**) my_realloc(par->fligan, (par->nfiles)*sizeof(char*)) ;
    			par->fcomplex = (char**) my_realloc(par->fcomplex, (par->nfiles)*sizeof(char*)) ;
     
    			par->fapo[nm1] = my_malloc((strlen(apo)+1)*sizeof(char)) ;
    			par->fcomplex[nm1] = my_malloc((strlen(complex)+1)*sizeof(char)) ;
    			par->fligan[nm1] = my_malloc((strlen(ligan)+1)*sizeof(char)) ;
     
    			strcpy(par->fapo[nm1], apo) ;
    			strcpy(par->fcomplex[nm1], complex) ;
    			strcpy(par->fligan[nm1], ligan) ;
     
    			fclose(f) ;
    		}
    		else return 0 ;
    	}
    	else return 0 ;
     
    	return 1 ;
    }
    A noter l'utilisation de my_malloc et my_realloc, simplment car j'utilise un petit gestionnaire d'allocation. Mais j'ai testé avec les versions standard (malloc et realloc) et même problème.

  8. #8
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Ca sent l'usine à gaz

    Jamais tu vérifies le retour de tes allocations ? (Peux être que tes fonctions le font elles même)

    Donc si je comprend bien à chaque ligne de ton fichier tu va appeler cette fonctions ?

    Cela ne m'entonne pas que ta stack n'aime pas trop ça...

  9. #9
    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
    Citation Envoyé par |PaRa-BoL Voir le message
    Donc si je comprend bien à chaque ligne de ton fichier tu va appeler cette fonctions ?
    Cela ne m'entonne pas que ta stack n'aime pas trop ça...
    Il n'y a pas à priori de problèmes de ce coté là.

    vinzzzz :
    Le code de cette fonction me semble correct (si tes fonctions my_malloc et my_realloc le sont)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		while(fgets(buf, 150, f)) {
    			n = par->nfiles ;
    			status = sscanf(buf, "%s %s %s", apobuf, complexbuf, ligbuf) ;
    Il faudrait vérifier le contenu de ces buffer: buf, apobuf, complexbuf et ligbuf

  10. #10
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Il n'y a pas à priori de problèmes de ce coté là.
    Je suis pas sûr si il y a 300 000 lignes dans le fichier

  11. #11
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Citation Envoyé par |PaRa-BoL Voir le message
    Ca sent l'usine à gaz

    Jamais tu vérifies le retour de tes allocations ? (Peux être que tes fonctions le font elles même)

    Donc si je comprend bien à chaque ligne de ton fichier tu va appeler cette fonctions ?

    Cela ne m'entonne pas que ta stack n'aime pas trop ça...
    Je suis d'accord pr l'usine a gaz Mais les optimisations viendront quand j'aurai un code qui marchera, c'est comme ca que je procède... Et puis pour du redimentionnement de tableau, a part realloc ou les listes chainées, le choix est assez restreint. Remarque je pourrait aussi compter le nombre de lignes au début.. BREF là n'est pas le sujet

    Sur un fichier de 5 lignes, si la pille se met a faire des seinnes, je sais plus quoi faire...

    @ diogene: Le contenu de mes varaibles est a prioris bon, car si j'affiche le contenu de ma structure juste avant de quitter la fonction, le contenu de mon fichier est bien stocké dans les varaibles de ma structure... Vraiment je n'arrive pas a comprendre

  12. #12
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    le contenu de mon fichier est bien stocké dans les varaibles de ma structure
    Ca ne veux pas dire que tu n'as pas un debordement quelque part.

  13. #13
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Oui certes, mais ce qui est bizard c'est qu'ici j'ai des buffers qui sont de taille nettement supérieur a ce que contient mon fichier...

    (pr la vérification des allocation, elles sont encapsulées dans les fonctions de mon gestionnaire d'alloc)

  14. #14
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    il faut que tu fasses un debug et que tu vois quand ton adresse de retour sur la pile est modifiée ou le base pointer...

    si tu es sous un windows 32 bit tu pourrais faire ça (sans mettre d'optimisation -O -O2 -O3):


    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
     
    #define TEST if((&eip)[-1] != ebp || (&eip)[-2] != eip) printf("erreur ligne %d : debordement dans la pile...", __LINE__)
     
    int add_list_data(char *str_list_file, s_params *par) 
    {
                 int eip,ebp;
    	FILE *f;
    	int n,
    	     nread = 0,
    	     status ;
     
    	char buf[150],
    		apobuf[10],
    		ligbuf[50],
    		complexbuf[50];
     
                 eip = (&eip)[-2];
                 ebp = (&eip)[-1];
    	f = fopen(str_list_file, "r") ; TEST;
     
    	if(f) {
    		while(fgets(buf, 150, f)) { TEST;
    			n = par->nfiles ; TEST;
    			status = sscanf(buf, "%s %s %s", apobuf, complexbuf, ligbuf) ; TEST;
     
    			if(status == 3) {
    				nread += add_prot(apobuf, complexbuf, ligbuf, par) ; TEST;
    			}
    		}
    	}
                 TEST;
            // FLAG
    	return(nread) ;
    }

  15. #15
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Je suis sous linux

  16. #16
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    gdb ? Cela dit ce que ta donné acx01b pourrai fonctionner sous Linux aussi

  17. #17
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    ouai ben essaye quand même si sizeof(int) = sizeof (void*) ça te donnera peut être où est l'erreur

  18. #18
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    J'ai essayé les TEST de acx01b, aucun affichage n'est apparu.

    J'ai lancé gdb, voici la sorti de mon programme et de GDB (avec l'ajout de quelques affichages):
    ==============
    Parameters of the program:
    > Protein 1: 'data/2onj1.pdb', 'data/2onj1.pdb', 'AB'
    > Protein 2: 'data/2onj2.pdb', 'data/2onj2.pdb', 'ABC'
    > Protein 3: 'data/2onj3.pdb', 'data/2onj3.pdb', 'ABDDC'
    > Protein 4: 'data/2onj4.pdb', 'data/2onj4.pdb', 'A'
    > Minimum alpha sphere radius: 3.000000
    > Maximum alpha sphere radius: 4.000000
    ==============
    *** stack smashing detected ***: /home/ecniv/Desktop/projet_long/cur_release/bin/pvalid terminated

    Program received signal SIGABRT, Aborted.
    0xffffe410 in __kernel_vsyscall ()
    (gdb) where
    #0 0xffffe410 in __kernel_vsyscall ()
    #1 0xb7deedf0 in raise () from /lib/tls/i686/cmov/libc.so.6
    #2 0xb7df0641 in abort () from /lib/tls/i686/cmov/libc.so.6
    #3 0xb7e249bb in ?? () from /lib/tls/i686/cmov/libc.so.6
    #4 0xbfaf4d8c in ?? ()
    #5 0x00000000 in ?? ()
    L'affichage entre les ==== affiche simplement le contenu de ma structure... J'appele une fonction qui s'en charge, juste avant le return...

  19. #19
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Par défaut
    Salut,

    Comme tu es sous linux, tu pourrais essayer valgrind, c'est un outil puissant qui permet de faire du profiling et du debuggage.

  20. #20
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    est-ce normal que tes buffers de stockage totalisent 110 bytes (50 + 50 ++ 10) et ton buffer de lecture 150 ?

    sinon je n'ai pas le courage de passer à travers tout, mais je crois que tu va être contraint aux méthodes de debug que l'on a mentionné dans le thread à ce sujet

    En particulier, je pense que dans ton cas le plus rapide et efficace sera d'encadrer des parties de code par des #ifdef pour les mettre en commentaires..

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. stack smashing detected?
    Par sayanmehdi dans le forum C
    Réponses: 1
    Dernier message: 15/06/2010, 14h09
  2. 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
  3. Probléme * stack smashing detected *
    Par Mat262 dans le forum Débuter
    Réponses: 13
    Dernier message: 23/12/2008, 21h34
  4. Problème de "stack smashing detected"
    Par Mr Light dans le forum C++
    Réponses: 9
    Dernier message: 29/02/2008, 09h09
  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