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 :

Probléme * stack smashing detected *


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut Probléme * stack smashing detected *
    Bonjour à tous,
    Je dois rendre un Compte Rendu de TP ce soir par Mail, et j'ai un programme qui marche nickel mais il y a un petit problème de *** stack smashing detected *** !!! et ça fait un peu moche ^^.

    donc mon programme c'est ça:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "charUtil.h"
     
    int main (int argc, char *argv[]) 
    {
    int A=0;
    int k=0;
    const char* src;
    char* dest;
    char tab1[9]={0};
    char tab2[9]={0}; 
    int length;
     
    if(strcmp(argv[1],"1")==0)
    A=1;
    else if(strcmp(argv[1],"2")==0)
    A=2;
    if(A==1)
    	{
    	nomPrint("progChaines");
    	for(k=1;k<argc;k++)	
    	nomPrint(argv[k]);
    	nomPrint("Donald");
    	nomPrint("Babar");	
    	}
    if(A==2)
    	{
    	dest=&tab2[0];
    	src="Babar";
    	stringCrossCopyN(dest,10,src);
    	printf("%s   ->   %s\n",src,dest);
    	stringCrossCopy(dest,src);
    	printf("%s   ->   %s\n",src,dest);
    	src="Donald";
    	stringCrossCopyN(dest,10,src);
    	printf("%s   ->   %s\n",src,dest);
    	stringCrossCopy(dest,src);
    	printf("%s   ->   %s\n",src,dest);
    	while(k<argc)
    	{
    	src=argv[k];
    	stringCrossCopyN(dest,10,src);
    	printf("%s   ->   %s\n",src,dest);
    	stringCrossCopy(dest,src);
    	printf("%s   ->   %s\n",src,dest);
    	k++;
    	}
    	printf("salut c'est fini.");
    	}
    return EXIT_SUCCESS;
    }
    (je précise que stringCrossCopyN(dest,N,source) prend le mot pointer par source et inverse tout les lettres par exemple Babar -> rabaB et rabaB sera pointé par dest. N sert a limitée le nombre de lettre inversé par exemple si N=5 ça fera ça : Babar -> raba. stringCrossCopy(dest,source) ca fait pareil sauf que il n'y a pas de limite il fera le traitement sur le mot en entier. )
    voilà donc comme ça le programme marche nickel mais je sais pas si vous l'avez remarqué, tab1 est inutilisé (et il me le dit a la compilation) mais si :
    - je le supprime
    - je change sa taille
    et que après je le compile et j'exécute progChaines 2, il fait le programme normalement presque jusqu'au bout puis j'ai tout le *** stack smashing detected *** et il écrit a la fin "salut c'est fini." puis il fini par écrire abandon. si j'exécute progChaines 1 ça marche nickel le programme 1.

    Si je renomme tab1 en ce que je veux du genre test ou ce que je veux et ben le programme s'exécute normalement et pas de *** stack smashing detected *** mais j'ai toujours a la compilation le message disant que test est inutilisé.

    je vous met un exemple de l'exécution avec le *** stack smashing detected *** :

    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
    desktop:~/Documents/TP/TP3$ make
    gcc -g -c -Wall -pedantic main.c
    gcc -lm main.o charUtil.o -o progChaines
    desktop:~/Documents/TP/TP3$ ./progChaines 2 tata totoldkeiejkfgf
    Babar   ->   rabaB
    Babar   ->   rabaB
    Donald   ->   dlanoD
    Donald    ->   dlanoD
    ./progChaines   ->   seniahCgo
    ./progChaines   ->   seniahCgorp/.
    2   ->   2
    2   ->   2
    tata   ->   atat
    tata   ->   atat
    totoldkeiejkfgf   ->   fgfkjeiek
    totoldkeiejkfgf   ->   fgfkjeiekdlotot
    *** stack smashing detected ***: ./progChaines terminated
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)[0xb7f42558]
    /lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x0)[0xb7f42510]
    ./progChaines[0x804890f]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7e5e685]
    ./progChaines[0x80484e1]
    ======= Memory map: ========
    08048000-08049000 r-xp 00000000 08:02 271749     /home/bernard/Documents/TP/TP3/progChaines
    08049000-0804a000 r--p 00000000 08:02 271749     /home/bernard/Documents/TP/TP3/progChaines
    0804a000-0804b000 rw-p 00001000 08:02 271749     /home/bernard/Documents/TP/TP3/progChaines
    08632000-08653000 rw-p 08632000 00:00 0          [heap]
    b7e2a000-b7e37000 r-xp 00000000 08:02 48734      /lib/libgcc_s.so.1
    b7e37000-b7e38000 r--p 0000c000 08:02 48734      /lib/libgcc_s.so.1
    b7e38000-b7e39000 rw-p 0000d000 08:02 48734      /lib/libgcc_s.so.1
    b7e47000-b7e48000 rw-p b7e47000 00:00 0 
    b7e48000-b7fa0000 r-xp 00000000 08:02 66234      /lib/tls/i686/cmov/libc-2.8.90.so
    b7fa0000-b7fa2000 r--p 00158000 08:02 66234      /lib/tls/i686/cmov/libc-2.8.90.so
    b7fa2000-b7fa3000 rw-p 0015a000 08:02 66234      /lib/tls/i686/cmov/libc-2.8.90.so
    b7fa3000-b7fa6000 rw-p b7fa3000 00:00 0 
    b7fa6000-b7fca000 r-xp 00000000 08:02 66242      /lib/tls/i686/cmov/libm-2.8.90.so
    b7fca000-b7fcb000 r--p 00023000 08:02 66242      /lib/tls/i686/cmov/libm-2.8.90.so
    b7fcb000-b7fcc000 rw-p 00024000 08:02 66242      /lib/tls/i686/cmov/libm-2.8.90.so
    b7fd9000-b7fdc000 rw-p b7fd9000 00:00 0 
    b7fdc000-b7ff6000 r-xp 00000000 08:02 48691      /lib/ld-2.8.90.so
    b7ff6000-b7ff7000 r-xp b7ff6000 00:00 0          [vdso]
    b7ff7000-b7ff8000 r--p 0001a000 08:02 48691      /lib/ld-2.8.90.so
    b7ff8000-b7ff9000 rw-p 0001b000 08:02 48691      /lib/ld-2.8.90.so
    bfbe4000-bfbf9000 rw-p bffeb000 00:00 0          [stack]
    salut c'est fini.Abandon
    je précise que les procédures se trouve dans un autre fichier. charUtil.c et que il y a les prototypes des fonctions dans charUtil.h
    le makefile que j'utilise est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    progChaines : main.o charUtil.o
    	gcc -lm main.o charUtil.o -o progChaines
    main.o : main.c
    	gcc -g -c -Wall -pedantic main.c
    charUtil.o : charUtil.c charUtil.h
    	gcc -g -c -Wall -pedantic charUtil.c

    Je reprécise que c'est trés pressant donc si vous pouviez me répondre dans les plus brefs délais ce serait sympa sachant que ce n'est pas un programme trés complexe.^^
    Merci d'Avance.
    A+ Matt

    pour ce qui veulent jeter un coup d'oeil à charUtil.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
    #include <string.h>
    #include "charUtil.h"
     
    /*----------------------------------------------------------------------*/
    /*	Nom : 		asciiCharToString					*/
    /*   	But :	Cree dans un buffer (à l'aide de snprintf une chaîne comportant un caractere ascii,
    	son code en hexadecimal et son code en décimal selon le format exact : (pour le caractère 0)
    			Caractere : <0>, valeur hexadecimale : 0x30, valeur decimale :  48.   	 
          Paramètres : 	buf, size : le buffer et sa taille
                         c:  valeur du caractere a afficher
    	Valeur rendue : ---
    	Précondition :							
    	Postcondition : 							
    ----------------------------------------------------------------------*/
        static void asciiCharToString(char* buf, int size, const char c )
       {
          (void)snprintf(buf,size,"Caractere : <%c>, valeur hexadecimale : 0x%x, valeur decimale : %3d.\n", c, c, c) ;
       }
     
        void asciiCharPrint(const char c )
       {
          char buf[256] ;
          asciiCharToString(buf,sizeof(buf), c) ;
          (void)fprintf(stdout, "%s",buf);
       }
     
        void nomPrint(const char *nom)
       {
       char length=0;
       int i=0;
       int j,k;
       char tab[50];
       const char* A=nom;
       while( *A != '\0')
    		{
    		length++;
    		tab[i++]=*A;
    		A++;
    		}
       printf("(%d) ",length);
       for(k=0;k<i;k++)
       printf("%c",tab[k]);
       printf("\n");
       for(j=0;j<i;j++)
       asciiCharPrint(tab[j]);
       }
     
    	void stringCrossCopy(char* destination, const char* source)
    	{
    	char length=0;
    	char *a=destination;
    	char *b=source;
    	int i=0;
    	char z;
    	while( *b != '\0' )
    		{
    		length++;
    		b++;
    		}
    	while (i<length)
    		{
    		b=source+i;
    		a=destination+length-i-1;
    		z=*b;
    		*a=z;
    		i++;
    		}
    	*(a+length)='\0';
    	}
     
    	void stringCrossCopyN(char* destination, int size, const char* source) 
    	{
    	char length=0;
    	char *a=destination;
    	char *b=source;
    	int i=0;
    	char z;
    	while( *b != '\0' )
    		{
    		length++;
    		b++;
    		}
    	if (length<size-1)
    	stringCrossCopy(destination,source);
    	else
    	{
    	while(i<size-1)
    		{
    		b=source+length-1-i;
    		a=destination+i;
    		z=*b;
    		*a=z;
    		i++;
    		}
    	*(a+1)='\0';
    	}
    	}

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Le programme a l'air de s'exécuter normalement chez moi, même en supprimant tab1 et test.

    (gcc 4.0.1 sur os.X.4.11)

    En revanche, dès qu'on commence à travailler sur des chaines un peu longues, une erreur de segmentation apparait.
    En effet, dest est utilisé pour recevoir les chaines inversées, mais jamais de la mémoire ne lui est alloué.

    Voici une solution pour éviter le problème :

    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
     
    int main(int argc, char *argv[])
    {
        int A = 0;
        int k = 0;
        const char *babar = "Babar";
        char *dest;
     
        if (strcmp(argv[1], "1") == 0) {
            A = 1;
        }
        else if (strcmp(argv[1], "2") == 0) {
            A = 2;
        }
        if (A == 1) {
            nomPrint("progChaines");
            for (k = 1; k < argc; k++)
                nomPrint(argv[k]);  
            nomPrint("Donald");
            nomPrint("Babar");
        }
        if (A == 2) {
            /* alloction de mémoire pour dest, il faudrai ajouter 
                un test pour vérifier que l'allocation a réussi. */
            dest = strdup(babar);
            stringCrossCopyN(dest, 10, babar);
            printf("%s   ->   %s\n", babar, dest);
            stringCrossCopy(dest, babar);
            printf("%s   ->   %s\n", babar, dest);
            /* libération de la mémoire utilisée */
            free(dest);
     
            while (k < argc) {
                /* allocation */
                dest = strdup(argv[k]);
                stringCrossCopyN(dest, 10, argv[k]);
                printf("%s   ->   %s\n", argv[k], dest);
                stringCrossCopy(dest, argv[k]);
                printf("%s   ->   %s\n", argv[k], dest);
                /* libération */
                free(dest);
                k++;
            }
            printf("salut c'est fini.");
        }
        return EXIT_SUCCESS;
    }

  3. #3
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut
    re,
    Merci beaucoup pour ta réponse mais on peut utiliser malloc a la place de strdup ??
    et sinon j'ai un autre problème tout simple.

    J'ai une mini question si je fais un programme genre test.
    je le lance comme ça ./test 5 dans la console.
    comment je peux récupérer le 5 dans une variable de type int !!!!!!!!!!! parce que en j'arrive a le récupérer en chaine de caractère mais pas dans une variable i par exemple qui est une variable déclarée au début du programme comme cela, int i.
    Merci d'avance.
    A+ Matt

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Mat262 Voir le message
    ...on peut utiliser malloc a la place de strdup ??
    strdup() = malloc() + strcpy()

    Citation Envoyé par Mat262 Voir le message
    ...parce que en j'arrive a le récupérer en chaine de caractère mais pas dans une variable i par exemple qui est une variable déclarée au début du programme comme cela, int i.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *p = "55";
    int i = atoi(p);  // ici, i vaut 55
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut
    Merci de tout cœur a vous deux.
    J'ai pu régler les différents problème.
    Merci Beaucoup.
    A+ Matt

  6. #6
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut
    Re,
    En fait j'ai encore une question et je sais pas si ce sera la dernière malheureusement.
    Comment ferais t-on pour écrire dans un fichier que l'on créer tout ce qu'affiche une procédure ?
    Merci d'avance.
    A+ Matt

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    fopen(), fprintf(), fclose()

    ou sinon la redirection de flux "a.out > mon_fichier.txt" mais dans ce cas, c'est la sortie de tout le programme (et pas que ta fonction) que tu prends.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Mat262 Voir le message
    Re,
    En fait j'ai encore une question et je sais pas si ce sera la dernière malheureusement.
    Comment ferais t-on pour écrire dans un fichier que l'on créer tout ce qu'affiche une procédure ?
    Merci d'avance.
    A+ Matt
    Pour écrire dans la console, on fait printf("hello\n");

    pour écrire dans un fichier, on ouvre le fichier en, et on utilise fprintf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FILE *f = fopen("toto.txt", "w");
    if(NULL==f) {
        /* l'ouverture a échoué */
        perror("fopen");
    } else {
        /* on écrit dans le fichier */
        fprintf(f, "Hello\n");
     
        /* faire plein d'autres choses*/
     
        /* une fois qu'on a plus besoin du fichier, on le ferme */
        fclose(f);
    }
    voir les man de fopen et fprintf.

  9. #9
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut
    moi j'ai fait ça mais ça marche pas

    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
    {
    	FILE *fdout;
    	const char* fichierout = argv[2];
    	fdout= fopen(fichierout,"w");
    	if (NULL == fdout )
    		{
    		fprintf (stderr,"erreur ouverture %s\n",fichierout);
    		perror("");
    		return EXIT_FAILURE;
    		}
    	nomPrint("progChaines");
    	for(k=1;k<argc;k++)	
    	nomPrint(argv[k]);
    	nomPrint("Girault");
    	nomPrint("Juston");
    	if (EOF == fclose(fdout))
    		{
    		fprintf(stderr,"erreur fermeture %s", fichierout);
    		return EXIT_FAILURE ;
    		}
     
    	}
    ça me créer le bon fichier, que j'ai mit en argument mais ça ne met pas tout ce qu'écrive les procédures dans la console. ça écrit quasiment rien, du style juste ça "ù".
    Vous voyez d'où ça vient ?
    A+ Matt

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fdout= fopen(fichierout,"a");
    Sinon, tu vas effacer ton fichier a chaque fois que tu rentres dans la fonction (c'est peut être un choix tu me diras) alors que là, cela rajoute à la fin du fichier existant ou cela le créé si nécessaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(fdout,"%s",stdout);
    Cela ne fait pas ce que tu penses


    Un exemple qui marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(fdout,"%s %d fois\n","Je suis bien passé ici", 12);
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  11. #11
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut
    Re,
    voici l'énoncé peut être que vous comprendrez mieux que ce que je vous est expliqué.

    programme 4 : Ecriture dans un fichier texte.
    → 12 : On veut pouvoir effectuer une copie (trace dans un fichier texte) des divers affichages
    obtenus lors de l’exécution de “ progChaine 1”, question 3. Pour cela il faut appeler le programme avec
    un premier paramètre qui est le nom du fichier « trace » : ainsi « progChaines 4 trace toto» va
    provoquer le même affichage que « progChaines 1 trace toto», mais en plus va générer un
    fichier nommé « trace » contenant exactement la même chose que ce qui s’affiche à l’écran.
    Si quelqu'un voit comment fait avec les fdin et fdout et tout le tralala je suis preneur, jpense pas qu'il faille retoucher au programme que lance Merci d'Avance.
    A+ Matt

    progChaines 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main (int argc, char *argv[])
    {
    nomPrint("progChaines");
    for(k=1;k<argc;k++)
    	       nomPrint(argv[k]);      
    nomPrint("Donald");
    nomPrint("Babar");
    }
    voilà la fonction nomPrint :
    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
    void nomPrint(const char *nom) 	
    {
    char length=0;
    int i=0;	
    int j;	
    char tab[50];
    const char* A=nom; 	
    while( *A != '\0')	
    		{
    		length++;
    		tab[i++]=*A;
    		A++;
    		}
    fprintf(stdout,"(%d) %s\n",length,nom); 	
    for(j=0;j<i;j++)				
    asciiCharPrint(tab[j]);  /*affiche la lettre et sa valeur hexa et sa valeur decimale. */ 
    }

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Mat262 Voir le message
    Bonjour à tous,
    Je dois rendre un Compte Rendu de TP ce soir par Mail, et j'ai un programme qui marche nickel mais il y a un petit problème de *** stack smashing detected *** !!! et ça fait un peu moche ^^.
    C'est un problème grave qui révèle probablement un comportement indéfini.

    Même en ajoutant le header manquant, ton code est incorrect :
    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
     
     
    -------------- Build: Debug in hello ---------------
     
    Compiling: main.c
    Compiling: charutil.c
    Linking console executable: bin\Debug\hello.exe
    C:\dev\hello\main.c: In function `main':
    C:\dev\hello\charutil.c: In function `asciiCharToString':
    C:\dev\hello\charutil.c:17: warning: implicit declaration of function `snprintf'
    C:\dev\hello\charutil.c: In function `asciiCharPrint':
    C:\dev\hello\charutil.c:24: warning: implicit declaration of function `fprintf'
    C:\dev\hello\charutil.c:24: error: `stdout' undeclared (first use in this function)
    C:\dev\hello\charutil.c:24: error: (Each undeclared identifier is reported only once
    C:\dev\hello\charutil.c:24: error: for each function it appears in.)
    C:\dev\hello\charutil.c: In function `nomPrint':
    C:\dev\hello\charutil.c:40: warning: implicit declaration of function `printf'
    C:\dev\hello\charutil.c: In function `stringCrossCopy':
    C:\dev\hello\charutil.c:52: warning: initialization discards qualifiers from pointer target type
    C:\dev\hello\charutil.c:62: warning: assignment discards qualifiers from pointer target type
    C:\dev\hello\charutil.c: In function `stringCrossCopyN':
    C:\dev\hello\charutil.c:75: warning: initialization discards qualifiers from pointer target type
    C:\dev\hello\charutil.c:89: warning: assignment discards qualifiers from pointer target type
    Process terminated with status 1 (0 minutes, 0 seconds)
    3 errors, 7 warnings
     
    C:\dev\hello\main.c:12: warning: unused variable `tab1'
    C:\dev\hello\main.c:14: warning: unused variable `length'
    Process terminated with status 0 (0 minutes, 0 seconds)
    3 errors, 9 warnings
    - indentation horrible
    - tu accedes à argv[1] sans avoir vérifié la valeur de argc : le comportement est indéfini.
    - tu passes une taille de 10 et un tableau de taille 9 à une fonction. Le comportement est indéfini.
    - tu utilises beaucoup trop de pointeurs intermédiaires au noms abscons. Le codage est difficile à lire.
    - il y a des redondances dans le code
    - dans certains cas, tu places un 0 en[1] ? Pourquoi ?
    - d'une manière générale, le code est trop compliqué...

  13. #13
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut
    Re,
    bon j'ai réussi a mettre tout ce qu'affiche
    dans un fichier (ici trace) dont le nom est l'argument 2 quand on exécute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./progChaines 4 trace toto
    le code de ./progChaines 4 est le suivant :
    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
     
    int main (int argc, char *argv[])
    {
    const char* fichierout;	
    const char* fichierin;
    FILE *fdin,*fdout;
     
    fichierout = argv[2];
    fdout = freopen(fichierout,"w",stdout);
    if(fdout==NULL)
    		       {
    		       fprintf (stderr,"Le fichier %s ne pas être modifié.\n",fichierout);
    		       perror("");
    		      (void)fclose(fdin);
    		      return EXIT_FAILURE;
    		       }
    nomPrint("progChaines"); 
    for(k=1;k<argc;k++)	
    		   nomPrint(argv[k]);
    nomPrint("Girault");
    nomPrint("Juston");
    if (EOF == fclose(fdout))			
    		{
                    fprintf(stderr,"erreur fermeture %s", fichierout);
    		return EXIT_FAILURE ;
    		}
    }
    le problème c'est que il y a rien qui s'affiche dans la console et moi je veux que l'affiche normal se fasse aussi. Voilà si vous avez la solution merci de me la donner. ^^
    A+ Matt

  14. #14
    Invité(e)
    Invité(e)
    Par défaut
    Bonsoir,

    il faut demander à nomPrint d'écrire dans le fichier et dans la sortie standard :
    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
    void asciiCharPrint(FILE* f, const char c )
    {
        char buf[256] ;
        asciiCharToString(buf,sizeof(buf), c);
        /* sortie standard (console) */
        fprintf(stdout, "%s",buf);
        if(NULL != f) {
            /* sortie fichier */
            fprintf(f, "%s",buf);
        }
    }
     
    void nomPrint(FILE *f, const char *nom) 	
    {
        char length=0;
        int i=0;	
        int j;	
        char tab[50];
        const char* A=nom; 	
        while( *A != '\0') {
            length++;
            tab[i++]=*A;
            A++;
        }
        /* sortie standard */
        fprintf(stdout, "(%d) %s\n",length,nom); 	
        if(NULL != f) {
            /* sortie fichier */
            fprintf(f, "(%d) %s\n",length,nom);
        }
        for(j=0;j<i;j++)				
        asciiCharPrint(tab[j]);  
    }

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