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

SL & STL C++ Discussion :

[STL List + variable environ] Seg fault dans un push_back ?


Sujet :

SL & STL C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 36
    Points : 26
    Points
    26
    Par défaut [STL List + variable environ] Seg fault dans un push_back ?
    Bonjour à tous

    J'ai un souci avec le code 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
    28
    29
    30
    31
    32
    33
    34
     
    std::list<const char *> MyClass::getEnvParametersMatching(const char *keyRegex) 
    {
      std::list<const char *> *listRet = new std::list<const char *>();
     
      static regex_t patternBuf;
     
      extern char **environ;
      char strEnviron[256];
      char* pchVarName = NULL;
     
      if ( regcomp( &patternBuf, keyRegex, REG_EXTENDED ) == 0 )
      {
        // Parcours de l'environnement
        while ( *environ != NULL )
        {
        	// Extrait le nom de la variable
        	strcpy( strEnviron, *environ );
        	pchVarName = strtok( strEnviron, "=");
     
    	// Si la clé correspond
        	if (regexec( &patternBuf, pchVarName, 0, 0, 0 ) == 0)
        	{	
        	    // On l'ajoute à la list
        	    listRet->push_back( *environ ); // SEG FAULT ???
        	}
     
        	// Variable d'environnement suivante
        	environ++;
        }
      }
     
      return listRet;
    }
    J'essaie d'insérer *environ ( qui est une chaîne de caractères, n'est-ce pas ? ) dans ma liste, mais j'ai systématiquement une segmentation fault à ce niveau...
    S'il est effectivement impossible d'ajouter une chaine "VAR=VAL" dans ma list, est-ce que vous auriez une idée pour ajouter simplement le nom de la variable ( VAR ) dans la list ?

    Auriez-vous une idée d'où se trouve le problème ?

    Par ailleurs, on m'a dit sur le forum C qu'il était interdit de faire environ++. Alors comment parcourir les variables d'environnement autrement ?

    Merci d'avance !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut
    quitte à utiliser une std::list, pourquoi ne pas utiliser aussi des std::string?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Pas le choix, imposé par l'historique de l'application

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Auriez-vous une idée d'où se trouve le problème ?
    Une petite, oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::list<const char *> *
    char **
    On ne devrait jamais voir ces horreurs dans un code C++. Enfin, si c'est imposé...

    Plus précisément, je ne vois pas où tu alloues la mémoire pour environ et *environ. Mais comme c'est une variable globale (beurk... et puis la manière dont elle est déclarée est un peu bourrine), peut-être que tout ceci est fait par une autre fonction.

    A part ça, il y a aussi le débogueur qui est là pour t'aider.

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Ton segfault viens de la

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      char strEnviron[256];
      char* pchVarName = NULL;
    
      if ( regcomp( &patternBuf, keyRegex, REG_EXTENDED ) == 0 )
      {
        // Parcours de l'environnement
        while ( *environ != NULL )
        {
        	// Extrait le nom de la variable
        	strcpy( strEnviron, *environ );
        	pchVarName = strtok( strEnviron, "=");
    strtok va modifier strEnviron en memoire.
    Donc au deuxième passage strcpy( strEnviron, *environ ); va faire n'importequoi

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Effectivement, j'avais pas pensé à ça

    Merci beaucoup !

    Pour info, voici le parcours des variables d'environnement correct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      extern char **environ;
      char** ptrEnviron;
     
      ptrEnviron = environ;
     
      // Parcours de l'environnement
      while ( *ptrEnviron != NULL )
      {
      	// blabla
     
      	// Variable d'environnement suivante
      	ptrEnviron++;
      }

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Ton segfault viens de la

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      char strEnviron[256];
      char* pchVarName = NULL;
    
      if ( regcomp( &patternBuf, keyRegex, REG_EXTENDED ) == 0 )
      {
        // Parcours de l'environnement
        while ( *environ != NULL )
        {
        	// Extrait le nom de la variable
        	strcpy( strEnviron, *environ );
        	pchVarName = strtok( strEnviron, "=");
    strtok va modifier strEnviron en memoire.
    Donc au deuxième passage strcpy( strEnviron, *environ ); va faire n'importequoi
    Oups j'ai dit n'importe quoi
    - strtok va modifier strEnviron en memoire. ça c'est vrai

    - Donc au deuxième passage strcpy( strEnviron, *environ ); va faire n'importequoi; ça c'est faux

    Ton segfault viens peut être que char strEnviron[256] est trop petit.
    essaie char strEnviron[1024]. Tout façon, ton erreur mémoire doit être avant le push_back, ce qui fait planter le celui ci. ATTENTION, Ce comportement peut être aléatoire. ça peut marcher pendant un temps et du jour au lendemain re planter.

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

Discussions similaires

  1. STL, problème d'ajout d'élément dans une list.
    Par hyuga33 dans le forum SL & STL
    Réponses: 7
    Dernier message: 21/03/2011, 11h40
  2. Seg fault de gluBuild2DMipmaps dans pthread
    Par poliok dans le forum OpenGL
    Réponses: 4
    Dernier message: 26/10/2010, 12h24
  3. Réponses: 1
    Dernier message: 11/09/2007, 12h16
  4. pb dans la stl::list avec size
    Par DEVfan dans le forum SL & STL
    Réponses: 6
    Dernier message: 10/01/2007, 18h35
  5. STL List et variable globale (extern)
    Par flipper203 dans le forum SL & STL
    Réponses: 9
    Dernier message: 04/07/2006, 14h20

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