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 *


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2020
    Messages : 1
    Points : 1
    Points
    1
    Par défaut *stack smashing detected *
    Bonjour à tous!
    Je bloque sur une erreur qui apparaît lors de l’exécution du programmes mais cette erreur n’empêche pas le bon affichage des valeurs de celui-ci du coup je ne comprend pas vraiment d’où elle vient et ce qu'elle veut dire.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct{
    	char mat[5];
    	int coeff;
    	char design[32];
    }Mat;
     
    Mat lireMat(FILE *flot){
    	Mat m;
    	fscanf(flot,"%s%d%*c",m.mat,&m.coeff);
    	fgets(m.design,32,flot);
    	m.design[strlen(m.design)-1]='\0';
     
    	return m;
    }
     
    int chargeFmatieres(char* nomFich, Mat* tMat[ ], int taillemax){
    	Mat m;
    	FILE *flot;
    	int i=0;
     
    	flot=fopen(nomFich,"r");
     
    	if(flot==NULL){
    		printf("Problème d'ouverture du fichier en mode lecture\n");
    		return -1;
    	}
     
    	m=lireMat(flot);
     
    	while(!feof(flot)){
    		if(i==taillemax){
    			printf("Problème le tableau est trop petit !\n");
    			return -2;
    		}
    		tMat[i]=(Mat *)malloc(sizeof(Mat));
     
    		if(tMat[i]==NULL){
    			printf("Problème d'allocation !\n");
    			fclose(flot);
    			return -3;
    		}
    		*tMat[i]=m;
    		i++;
    		m=lireMat(flot);
    	}
    	fclose(flot);
    	return i;
    }
     
    void afficheMat(Mat** tMat, int nbmat){
    	int i=0;
    	for(i=0;i<nbmat;i++){
    		printf("%s\t%d\t%s\n",tMat[i]->mat,tMat[i]->coeff,tMat[i]->design);
    	}
    	printf("\n");
    }
    void testCharge (void){
    	Mat *tMat;
    	char nomFich[20];
    	int nbmat;
     
    	printf("Rentrez un nom de fichier !");
    	scanf("%s%*c",nomFich);
     
    	nbmat=chargeFmatieres(nomFich,&tMat,300);
     
    	afficheMat(&tMat,nbmat);
     
    	free(tMat);
    }
     
    int main(void){
    	testCharge();
    	return 0;	
    }
    affichage :

    Rentrez un nom de fichier !fmat.don
    acsi1	4	analyse et conception
    algo1	4	algorithmique période 1
    algo2	4	algorithmique période 2
    based	4	base de données
    maths	2	mathématiques
    organ	2	organisation
    
    *** stack smashing detected ***: terminated
    Abandon (core dumped)
    Merci pour toute aide !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    6 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 6 634
    Points : 30 338
    Points
    30 338
    Billets dans le blog
    4
    Par défaut
    Ton fscanf a un format qui attend 4 variables, et tu en fournis 2.
    mat peut contenir 4 caractères max mais tu cherches %s sans limite.
    Ensuite tu utilises strlen sur design pour ajouter un \0 avant la fin... sauf que strlen compte sur un \0 pour trouver la fin, donc ton code au mieux supprime le dernier caractère, au pire va mettre un \0 arbitrairement n'importe où en mémoire.
    tMat est jamais alloué.
    Fuites mémoires.
    Risque que le fichier ne soit pas refermé.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    1 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 1 243
    Points : 6 057
    Points
    6 057
    Par défaut
    Bonjour,

    Le scanf ne prend pas de garanties mais devrait fonctionner si la chaîne mat ne fait pas plus 4 caractères et le fichier ne contient pas de lignes de plus de 31 caractères.
    Par contre dans la fonction testCharge() on a tMat qui pointe sur des Mat c'est donc un tableau de Mat, ligne 70 tu en passes l'adresse c'est donc un pointeur sur un tableau Mat** qui reçoit la fonction. Dans la fonction il est devenu un Mat*[] donc un tableau de pointeurs, ce que le compilateur ne peut pas détecter (car les 2 peuvent s'écrire Mat**). La fonction va donc allégrement remplir un tableau imaginaire pour y mettre des pointeurs!
    Ce qu'il faut faire, j'ai tagué avec /**/ les lignes modifiées
    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
    /**/int chargeFmatieres( char* nomFich, Mat** tMat, int taillemax) {
            Mat m;
            FILE *flot;
            int i=0;
     
            flot=fopen(nomFich,"r");
     
            if(flot==NULL){
                    printf("Problème d'ouverture du fichier en mode lecture\n");
                    return -1;
            }
     
            m=lireMat(flot);
     
    /**/	*tMat = NULL;
    	while(!feof(flot)){
    		if(i==taillemax){
    			printf("Problème le tableau est trop petit !\n");
    /**/                    fclose(flot);
    /**/			free(*tMat);
    /**/                    *tMat = NULL;
                            return -2;
                    }
    /**/		if ( *tMat == NULL ) {
    /**/                    *tMat = malloc( sizeof(Mat) * taillemax );
     
    /**/			if ( *tMat == NULL ) {
    				printf("Problème d'allocation !\n");
    				fclose(flot);
    				return -3;
    			}
    /**/            }
    /**/		(*tMat)[i] = m;
    		i++;
    		m=lireMat(flot);
    	}
    	fclose(flot);
    	return i;
    }

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    8 775
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 8 775
    Points : 24 089
    Points
    24 089
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Tu devrais t'arranger pour que lireMat() renvoie une valeur spéciale quand elle ne lit plus rien.
    Ca te permettrait de remplacer
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    m=lireMat(...)
    while (!feof(...)) {
        ...
        m=lireMat(...)
    }
    par
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ((m=lireMat(...)) != valeur_speciale) {
        ...
    }
    Déjà ça t'éviterait d'utiliser feof() que tu as détourné de son but initial, et ça optimiserait ton code (un seul accès au fichier au lieu de 2)
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

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, 14h50
  2. Probléme * stack smashing detected *
    Par Mat262 dans le forum Débuter
    Réponses: 13
    Dernier message: 23/12/2008, 22h34
  3. Problème de "stack smashing detected"
    Par Mr Light dans le forum C++
    Réponses: 9
    Dernier message: 29/02/2008, 10h09
  4. stack smashing detected et sscanf
    Par vinzzzz dans le forum Bibliothèque standard
    Réponses: 34
    Dernier message: 03/12/2007, 17h50
  5. "stack smashing detected" encore...
    Par incal dans le forum Débuter
    Réponses: 11
    Dernier message: 01/10/2007, 18h53

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