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 :

[manipulation de chaînes] erreur de segmentation


Sujet :

C

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut [manipulation de chaînes] erreur de segmentation
    bonjour. J'ai reussi a trouver en plaçant des messages de sortie avant et après dans l'exécution d'un programme que une fonction que j'avais écrite était responsable d'une erreur de segmentation. Je vous donne le code de cette fonction car je ne comprends pas pourquoi elle génère une erreur de segmentation lorsqu'elle est appelée. C'est une fonction qui concatène deux chaînes en faisant une allocation dynamique pour avoir une chaîne finale complète dont la taille en mémoire correspond strictement au nombre d'élèment. Voici ce que j'ai fait :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    char * add_suffixe(const char * name_in, const char * suffixe)
    {
         char * name_out;
         size_t name_length;
         size_t suffixe_length;
         size_t total_length;
         name_length = strlen( name_in );
         suffixe_length = strlen( suffixe );
         total_length=name_length+suffixe_length+1;
         name_out = malloc(total_length);
         if(name_out==NULL)
         {
              printf("erreur d'allocation memoire sur la chaine name_out\n");
         }
         else
         {
              strncpy(name_out, name_in, name_length+1);
              printf("Le nom du fichier original est %s\n",name_in);
              strcat(name_out, suffixe);
              printf("le nom du fichier de sortie est %s\n",name_out);
         }
         return name_out;
    }
    Je ne comprends pas pourquoi le programme plante juste à cet endroit, sans me donner la moindre indication de débogage. Je peux postuler que c'est parce que je passe peut être des chaînes trop longues en suffixe mais ça me paraît bizarre puisqque tout est calculé à l'octet près. Merci en tous cas de votre aide.

    Je dois dire aussi que le deuxième argument de cette fonction (char * suffixe) est systématiquement un char * que j'obitens avec cette fonction :
    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
     
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
     
    char * get_optiontextstring(const char * input_string)
    {
         char * index;
         int guillemet = '"';
         index = strstr(input_string,"OptionText");
         if(index!=NULL){
         index = strchr(index,guillemet);
         }
         return index;
    }
    Je ne veux pas poster mon algo en entier tout de suite je crois vraiment que l'erreur est dans add_suffixe mais pas moyen de la détecter.

  2. #2
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour kromartien,

    La fonction 'get_optiontextstring' peut retourner la valeur NULL:

    1) Si le string "OptionText" n'est pas trouvé dans l'argument 'input_string'
    2) Si le carctère '"' n'est pas trouvé.


    La fonction 'add_suffixe' n'est pas sécurisée. Tu ne testes pas si les arguments passés ont la valeur NULL.

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Par défaut
    Une allocation dynamique pour ton index pourrait peut-être t'aider...

  4. #4
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Citation Envoyé par todor
    Une allocation dynamique pour ton index pourrait peut-être t'aider...
    +10 pour todor

    Je n'ai aucune excuse pour ne pas avoir vu une si grosse erreur

  5. #5
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par todor
    Une allocation dynamique pour ton index pourrait peut-être t'aider...
    Pourquoi faire ?
    Je ne vois pas où est le problème.
    Pour info : http://www.linux-kheops.com/doc/man/.../strstr.3.html

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par jowo
    +10 pour todor

    Je n'ai aucune excuse pour ne pas avoir vu une si grosse erreur
    Je dirais -10 car c'est complètement inutile, la fonction renvoie un pointeur qui se trouve être la position de départ de la sous-chaîne recherchée donc pas de soucis !

    Pour la première fonction j'aurais plutôt utilisé strcpy au lieu de strncpy étant donné que la chaîne complète est de toute façon copiée !

    Un test aussi pour vérifier la validité des arguments ne serait pas un luxe !
    Aère aussi un peu plus ton code, les lignes vides ca existe !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Est-ce que tu peux nous montrer comment tu fait l'appel des deux fonctions dans ton programme ? J'ai ma petite idée mais j'aimerais voir si chez toi ton problème viens de là
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    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 kromartien
    bonjour. J'ai reussi a trouver en plaçant des messages de sortie avant et après dans l'exécution d'un programme que une fonction que j'avais écrite était responsable d'une erreur de segmentation. Je vous donne le code de cette fonction car je ne comprends pas pourquoi elle génère une erreur de segmentation lorsqu'elle est appelée. C'est une fonction qui concatène deux chaînes en faisant une allocation dynamique pour avoir une chaîne finale complète dont la taille en mémoire correspond strictement au nombre d'élèment. Voici ce que j'ai fait :

    Je ne comprends pas pourquoi le programme plante juste à cet endroit,
    Code pas clair avec strncpy(). Inutile, utiliser strcpy().
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
     
    static char *add_suffixe (const char *name_in, const char *suffixe)
    {
       char *name_out = NULL;
       size_t const suffixe_length = strlen (suffixe);
       if (suffixe_length > 0)
       {
          size_t const total_length = strlen (name_in) + suffixe_length + 1;
     
          name_out = malloc (total_length);
          if (name_out != NULL)
          {
             strcpy (name_out, name_in);
             printf ("Le nom du fichier original est %s\n", name_in);
             strcat (name_out, suffixe);
             printf ("le nom du fichier de sortie est %s\n", name_out);
          }
          else
          {
             printf ("erreur d'allocation memoire sur la chaine name_out\n");
          }
       }
       return name_out;
    }
     
    int main (void)
    {
       char *s = add_suffixe ("hello", ".world");
     
       if (s != NULL)
       {
          puts (s);
          free (s), s = NULL;
       }
     
       assert (s == NULL);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Le nom du fichier original est hello
    le nom du fichier de sortie est hello.world
    hello.world
     
    Press ENTER to continue.

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut
    Citation Envoyé par jowo
    Bonjour kromartien,

    La fonction 'get_optiontextstring' peut retourner la valeur NULL:

    1) Si le string "OptionText" n'est pas trouvé dans l'argument 'input_string'
    2) Si le carctère '"' n'est pas trouvé.


    La fonction 'add_suffixe' n'est pas sécurisée. Tu ne testes pas si les arguments passés ont la valeur NULL.
    Oui je crois que c'est tout à fait vrai, un des points qui ont fait que ma fonction n'est pas très bonne. J'ai utilisé strdup au final dans get_optionstring avec le free correspondant bien placé. De même c'est du bidouillage sur fichier texte, c'est une peu hasardeux tout ça il suffit d'un champ manquant et je me retrouve le bec dans l'eau c'est vrai.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 11/11/2014, 11h18
  2. Réponses: 9
    Dernier message: 24/08/2013, 10h30
  3. Réponses: 23
    Dernier message: 14/03/2009, 15h57
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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