[Resolu] sprintf avec gcc4 : Segmentation Fault
Bonjour, je viens vous demander un peu d'aide.
Je travaille sur un programme en C depuis 3 ans, et j'utilisais gcc3.
De nouvelles contraintes m'imposent gcc4 et je ne pensais pas que j'aurais eu autant de problemes.
Apres avoir mieux ecrit les cast, j'ai réussi à compiler mon programme sans erreur, ni warning.
Malheuresement à l'execution, j'obtiens un Segmentation fault.
Gdb me dit :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
Program received signal SIGSEGV, Segmentation fault.
0xb7c1a4c0 in strcpy () from /lib/tls/libc.so.6
(gdb) info thread
* 1 Thread -1214757184 (LWP 4736) 0xb7c1a4c0 in strcpy () from /lib/tls/libc.so.6
(gdb) backtrace
#0 0xb7c1a4c0 in strcpy () from /lib/tls/libc.so.6
#1 0x0804a4b9 in litConfig () at prog.c:300
#2 0x080a8a97 in main (argc=1, argv=0xbf815b64) at prog.c:20691
(gdb) frame 0
#0 0xb7c1a4c0 in strcpy () from /lib/tls/libc.so.6 |
La ligne incriminée est l'utilisation de sprintf.
Je résume la partie de code qui pose pb :
Code:
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
|
int litConfig()
{
FILE * conf ;
char buffer[150];
char ligne[100];
char* separateurs = { " \n" };
char* p;
char pt[30];
strcpy(buffer,DOSSIERCONF);
strcat(buffer,"/config");
if((conf = fopen (buffer,"r")) == NULL)
{
printf("Erreur ouverture config %s",buffer);
return 0;
}
while (fgets (ligne, sizeof(ligne), conf) != NULL)
{
//premier appel, renvoie le premier mot
p = strtok(ligne, separateurs);
// ligne où gdb annonce l'erreur :
sprintf(pt,"%s", p);
if (!strcmp(p,"fullscreen"))
{
if (p != NULL ) p = strtok(NULL, separateurs);
sprintf(pt,"%s", p);
if (p != NULL ) config.FULLSCREEN=atoi(pt);
}
}
} |
Je pense que gcc4 n'aime pas cette façon de faire sans malloc.
Savez vous comment je peux corriger cela ?
Merci pour votre aide.
Re: sprintf avec gcc4 : Segmentation Fault
Citation:
Envoyé par stephane_bou
Code:
1 2 3 4
|
Program received signal SIGSEGV, Segmentation fault.
0xb7c1a4c0 in strcpy () from /lib/tls/libc.so.6
(gdb) info thread |
Je résume la partie de code qui pose pb : <...>
Ce code fonctionne, mais l'original étant incomplet, j'ai du improviser... J'ai simplifié et durci le code...
Code:
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
|
#define DOSSIERCONF "."
struct
{
int FULLSCREEN;
}
config;
int litConfig()
{
int err = 0;
char buffer[] = DOSSIERCONF "/config";
FILE * conf = fopen (buffer,"r");
if (conf != NULL)
{
char ligne[100];
while (!err && fgets (ligne, sizeof(ligne), conf) != NULL)
{
static char const separateurs[] =" \n";
//premier appel, renvoie le premier mot
char*p = strtok(ligne, separateurs);
if (p != NULL )
{
if (strcmp (p,"fullscreen") == 0)
{
if (p != NULL )
{
p = strtok(NULL, separateurs);
if (p != NULL )
{
config.FULLSCREEN=atoi(p);
}
else
{
printf("data error\n");
err=1;
}
}
else
{
printf("unknown parameter\n");
err=1;
}
}
else
{
printf("format error\n");
err=1;
}
}
else
{
printf("format error\n");
err=1;
}
}
}
else
{
printf("Erreur ouverture config '%s'\n",buffer);
err= 1;
}
return err;
}
int main(void)
{
int err = litConfig();
printf("config.FULLSCREEN=%d\n",config.FULLSCREEN);
return 0;
} |
avec le fichier de données :