OVH Cloud OVH Cloud

stack smashing detected

16 réponses
Avatar
bpascal123
Je vais essayer de trouver l'erreur avant de lire vos r=E9ponses et/ou
conseils que j'accueillerais avec plaisir. Sur les r=E9sultats de
google, stack smashing detected semble =EAtre une erreur dure =E0 trouver.
Pour le code ci-dessous, c'est un exercice que j'ai =E9cris une dizaine,
vingtaine de fois voire +. Mais =E7a fait d=E9j=E0 quelques semaines et je
ne sais plus o=F9 sont les fichiers...En plus, il y a de nombreuses
fa=E7ons diff=E9rentes d'=E9crire, lire un fichier en tant que d=E9butant a=
vec
des fonctions simples...

Le code o=F9 se trouve l'erreur :

/*
* lire data15a.txt et supprimer les enreg. dont le no. est inferieur a
5 et copier
* dans data15rev.txt
*/

#include <stdio.h> /* printf fprintf fscanf fopen fclose fgetc feof
*/
#include <stdlib.h> /* exit */

#define CRECMAX 10 /* nbr d'enreg. max */
#define CTXTMAXL 20 /* long. de caracteres max */

void ReadFile(FILE *FP_FILE) ;
void ReadDelCopyFile(FILE *FP_SOURCE, FILE *FP_DEST) ;
void OpenFile(FILE *FP_FILE) ;

int main(void)
{
FILE *MP_SOURCE =3D NULL ;
FILE *MP_DESTI =3D NULL ;
char MPSource[] =3D "/media/XP/code_c/data15a.txt" ;
char MPDesti[] =3D "/media/XP/code_c/data15rev.txt" ;

printf("\nDebut du programme\n") ;

printf("\nOuverture de \"data15a.txt\" : \n") ;
MP_SOURCE =3D fopen(MPSource, "r") ;
OpenFile(MP_SOURCE) ;

printf("\nOuverture de \"data15rev.txt\" : \n") ;
MP_DESTI =3D fopen(MPDesti, "w") ;
OpenFile(MP_DESTI) ;

ReadDelCopyFile(MP_SOURCE, MP_DESTI) ;

ReadFile(MP_DESTI) ;

printf("\n\n") ;
return 0 ;
}

void ReadDelCopyFile(FILE *FP_SOURCE, FILE *FP_DESTI)
{
int i ;
int FNum[CRECMAX] ;
char FTxt1[CTXTMAXL] ;
char FTxt2[CTXTMAXL] ;

while(!feof(FP_SOURCE))
{
if (fscanf(FP_SOURCE, "%d%s%s", &FNum[i], FTxt1, FTxt2) =3D=3D 3)
if (FNum[i] > 5)
{
fprintf(FP_DESTI, "%d\n%s\n%s\n", FNum[i], FTxt1, FTxt2) ;
i++ ;
}
}
}

void ReadFile(FILE *FP_FILE)
{
int c ;
printf("\n") ;
while ((c =3D getc(FP_FILE) !=3D EOF))
putc(c, FP_FILE) ;
}

void OpenFile(FILE *FP_FILE)
{
if (!FP_FILE)
{
printf("\nErreur ouverture de fichier!\n") ;
exit(EXIT_FAILURE) ;
}
else
printf("\nOuverture reussie.\n") ;
}


Le message d'erreur lors de l'execution (pas de message dans la phase
de compilation) :

Ouverture reussie.
*** stack smashing detected ***: ./exdiv3w terminated
=3D=3D=3D=3D=3D=3D=3D Backtrace: =3D=3D=3D=3D=3D=3D=3D=3D=3D
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)[0x2f2008]
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x0)[0x2f1fc0]
./exdiv3w[0x804883a]
./exdiv3w[0x804874c]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x227b56]
./exdiv3w[0x8048591]
=3D=3D=3D=3D=3D=3D=3D Memory map: =3D=3D=3D=3D=3D=3D=3D=3D
00211000-0034f000 r-xp 00000000 08:06 5269 /lib/tls/i686/cmov/
libc-2.10.1.so
0034f000-00350000 ---p 0013e000 08:06 5269 /lib/tls/i686/cmov/
libc-2.10.1.so
00350000-00352000 r--p 0013e000 08:06 5269 /lib/tls/i686/cmov/
libc-2.10.1.so
00352000-00353000 rw-p 00140000 08:06 5269 /lib/tls/i686/cmov/
libc-2.10.1.so
00353000-00356000 rw-p 00000000 00:00 0
00575000-00591000 r-xp 00000000 08:06 3651 /lib/libgcc_s.so.1
00591000-00592000 r--p 0001b000 08:06 3651 /lib/libgcc_s.so.1
00592000-00593000 rw-p 0001c000 08:06 3651 /lib/libgcc_s.so.1
00baa000-00bc5000 r-xp 00000000 08:06 7860 /lib/ld-2.10.1.so
00bc5000-00bc6000 r--p 0001a000 08:06 7860 /lib/ld-2.10.1.so
00bc6000-00bc7000 rw-p 0001b000 08:06 7860 /lib/ld-2.10.1.so
00e55000-00e56000 r-xp 00000000 00:00 0 [vdso]
08048000-08049000 r-xp 00000000 08:01 35163 /media/XP/code_c/
exdiv3w
08049000-0804a000 r--p 00000000 08:01 35163 /media/XP/code_c/
exdiv3w
0804a000-0804b000 rw-p 00001000 08:01 35163 /media/XP/code_c/
exdiv3w
099c1000-099e2000 rw-p 00000000 00:00 0 [heap]
b780e000-b780f000 rw-p 00000000 00:00 0
b781f000-b7824000 rw-p 00000000 00:00 0
bfae5000-bfafa000 rw-p 00000000 00:00 0 [stack]
Aborted

merci pour votre aide

6 réponses

1 2
Avatar
Tonton Th
On 10/04/2010 12:52 AM, wrote:

de vue de sa forme (l'icone existe toujours).



Lol !

--
Ma coiffeuse est formidable - http://sonia.buvette.org/
Avatar
bpascal123
On 4 oct, 17:41, Tonton Th wrote:
On 10/04/2010 12:52 AM, wrote:

> de vue de sa forme (l'icone existe toujours).

    Lol !

--
Ma coiffeuse est formidable -http://sonia.buvette.org/



Ce code est très ordinaire mais il résoud le problème d'affichage
écran sur un fichier texte:

#include <stdio.h> /* printf fprintf fscanf fopen fclose fgetc feof
*/
#include <stdlib.h> /* exit */

#define CRECMAX 10 /* nbr d'enreg. max. */
#define CTXTMAXL 20 /* long. de caracteres max. */

int main(void)
{
FILE *MP_SOURCE ;
char MP_Name[] = "/media/XP/code_c/ga1.txt" ;

int Ticket ;
char FNom[CRECMAX] ;
char FPren[CRECMAX] ;

if ((MP_SOURCE = fopen(MP_Name, "r")) == NULL)
fputs("Impossible d'ouvrir le fichier", stderr) ;
else
while (fscanf(MP_SOURCE, "%d%s%s", &Ticket, FNom, FPren) == 3)
printf("%dn%sn%sn", Ticket, FNom, FPren) ;

printf("nn") ;
return 0 ;
}

Est-ce que c'est autant fonctionnel que le code "blindé" qui fait
appel au préprocesseur? Je ne connais pas encore bien le rôle du
préprocesseur sauf que c'est une histoire de registres plutôt que de
mémoire ram? Je vais faire une recherche quand je serais face à un
exercice... Il me semble aussi qu'il y a beaucoup de code
preprocesseur pour la programmation d'un système d'exploitation. C'est
pour facilité l'accès au hardware et accélerer le traitement (signal
video, son, clavier...) ?

Merci pour un usage du français plus "relaxe" dans la mesure du
possible.

Merci
Avatar
Samuel DEVULDER
Le 08/10/2010 00:54, a écrit :

Est-ce que c'est autant fonctionnel que le code "blindé" qui fait
appel au préprocesseur?



Quel appel? Il n'y a pas d'appel du préprocesseur dans le code. Le
préprocesseur est appelé par le compilo avant de faire le travail de
compilation.

Je ne connais pas encore bien le rôle du
préprocesseur sauf que c'est une histoire de registres plutôt que de
mémoire ram?



Non rien à voir. Pre-processing signifié pré-traitement. C'est à dire
avant la compilation à proprement parler. Le préprocesseur, c'est
grosso-merdo un truc qui modifie le code source avant que le compilateur
le transforme en code machine. En simplifiant à mort c'est comme si tu
faisais une suite de rechercher/remplacer dans le texte. (pense à la
fonction "remplacer-par" de word).

Ainsi, si dans ton code tu écris:

#define VAL 124
int i = VAL;

Le préprocesseur va trouver la ligne avec le #, puis remplacer A par 124
dans la suite du source et le compilo va lire:

int b = 124;

sam.
Avatar
bpascal123
En fait, je voulais savoir si le code qui fait appel à #if ... de Ed :

#if 0
/* cette fonction affiche le tout : alors le fichier est lisible */
void DisplayRec (FILE * FP_DESTI)
{
int c;
printf ("nnAFFICHAGE : n");
while ((c = getc (FP_DESTI)) != EOF)
putchar (c);
}

#endif

...si ce code (avec les modifications nécessaires) est très différent
du code du code du post précédent (repris en partie ci-dessous) ?

if ((MP_SOURCE = fopen(MP_Name, "r")) == NULL)
fputs("Impossible d'ouvrir le fichier", stderr) ;
else
while (fscanf(MP_SOURCE, "%d%s%s", &Ticket, FNom,
FPren) == 3)
printf("%dn%sn%sn", Ticket, FNom, FPren) ;

Je suppose que pour quelque chose d'aussi simple, je me pose beaucoup
trop de questions mais comme fscanf, fprintf ne sont pas des
fonctions élémentaires et je n'ai pas envie de passer trop de temps
sur les fonctions élémentaires de lecture de fichier avec opérations
sur bits, permissions..., j'estime utile de bien comprendre les
fonctions non-élémentaires.
Avatar
Benoit Izac
Bonjour,

le 09/10/2010 à 22:52, bpascal a écrit dans le message
:

En fait, je voulais savoir si le code qui fait appel à #if ... de Ed :

#if 0
/* cette fonction affiche le tout : alors le fichier est lisible */
void DisplayRec (FILE * FP_DESTI)
{
int c;
printf ("nnAFFICHAGE : n");
while ((c = getc (FP_DESTI)) != EOF)
putchar (c);
}

#endif



Ce que tu n'as pas compris, c'est que ce code est en commentaire : lors
du passage du pré-processeur, le test « #if 0 » va échouer donc toute
cette partie va être retirée et le compilateur ne la verra pas.

Si tu veux l'utiliser, il faut remplacer le « #if 0 » par « #if 1 » ou
supprimer « #if 0 » et « #endif »

--
Benoit Izac
Avatar
Samuel DEVULDER
Le 09/10/2010 22:52, a écrit :


En fait, je voulais savoir si le code qui fait appel à #if ... de Ed :

#if 0
/* cette fonction affiche le tout : alors le fichier est lisible */
void DisplayRec (FILE * FP_DESTI)
{
int c;
printf ("nnAFFICHAGE : n");
while ((c = getc (FP_DESTI)) != EOF)
putchar (c);
}

#endif

...si ce code (avec les modifications nécessaires) est très différent
du code du code du post précédent (repris en partie ci-dessous) ?



Ben oui.. l'un utilise une lecture caractère par caractère et l'autre
lit des entrées formatées. Ils ne font pas la même chose.

Je suppose que pour quelque chose d'aussi simple, je me pose beaucoup
trop de questions mais comme fscanf, fprintf ne sont pas des
fonctions élémentaires et je n'ai pas envie de passer trop de temps
sur les fonctions élémentaires de lecture de fichier avec opérations
sur bits, permissions..., j'estime utile de bien comprendre les
fonctions non-élémentaires.



Je ne sais pas, mais perso je n'utilise pas les entrées formatées avec
fscanf().. Cette fonction ne s'utilise pour ainsi dire qu'en TP à
l'école ou pour les expériences de coin de table. Dans la vraie vie, les
gens font des entrées/sorties autrement dans lesquelles ils contrôlent
plus les choses. .

sam.
1 2