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 :

sprintf avec gcc4 : Segmentation Fault


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut [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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
    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.

  2. #2
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    A mon avis, il manque des tests pour etre sur que ce que tu veux mettre dans pt (ce qui est pointe par p) ne depasse pas les 29 caracteres (+1 pour le \0).
    Peut-etre qu'avec gcc 3 il restait de la place apres pt et donc si tu depassais ca "allais" alors que gcc 4 t'empeche de "deborder" (surement pour eviter les buffer-oveflow !!)

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: sprintf avec gcc4 : Segmentation Fault
    Citation Envoyé par stephane_bou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
    #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 :
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    merci bcp pour votre aide

    je suis en train de modifier les milliers de sprintf que j'avais ecris.
    des que je vois mon programme tourner correctement, j'edite mon topic pour mettre [Resolu]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 21
    Dernier message: 23/04/2015, 13h59
  2. Probleme de segmentation fault avec sprintf
    Par MathG dans le forum C++
    Réponses: 5
    Dernier message: 14/12/2006, 01h12
  3. Segmentation fault avec glCompressedTexImage2DARB
    Par patbier dans le forum OpenGL
    Réponses: 5
    Dernier message: 12/12/2005, 10h32
  4. pb avec un warning et un segmentation fault
    Par salseropom dans le forum C
    Réponses: 10
    Dernier message: 30/11/2005, 16h48
  5. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17

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