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 :

Program terminated with signal 11, Segmentation fault.


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut Program terminated with signal 11, Segmentation fault.
    Bonjour,

    Je débute en C, pouvez vous m'aider à résoudre ce problème svp :

    (gdb) BT
    #0 vsprintf_irc (str=0x64c525 "#!Accueil!\r\n", format=0x438b6d "", vl=0x7fff48d252a0) at sprintf_irc.c:291
    #1 0x00000000004332c7 in vsendto_prefix_one (to=0x65cfe0, from=<value optimized out>, pattern=0x438b62 ":%s PART %s", vl=0x7fff48d252a0) at send.c:324
    #2 0x0000000000433979 in sendto_channel_butserv (chptr=<value optimized out>, from=0x65ed40, pattern=0x438b62 ":%s PART %s") at send.c:571
    #3 0x000000000040be52 in m_part (cptr=0x65ed40, sptr=<value optimized out>, parc=<value optimized out>, parv=0x568de0) at channel.c:3547
    #4 0x00000000004171c6 in dopacket (cptr=0x65ed40, buffer=<value optimized out>, length=0) at packet.c:104
    #5 0x000000000041f1d3 in read_message (delay=<value optimized out>) at s_bsd.c:1563
    #6 0x000000000041062d in main (argc=1219822525, argv=<value optimized out>) at ircd.c:979
    En erreur j'ai :

    Program terminated with signal 11, Segmentation fault.
    #0 vsprintf_irc (str=0x64c525 "#!Accueil!\r\n", format=0x438b6d "", vl=0x7fff48d252a0) at sprintf_irc.c:291 (NB : ligne f ((*str = *p1)))
    Voila la fonction vsprintf_irc :

    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
    char *vsprintf_irc(register char *str, register const char *format, register va_list vl)
    {
       register char c;
     
       while ((c = *format++))
       {
             if (c == '%')
             {
                c = *format++; /* May never be '\0' ! */
     
                if (c == 'c')
                {
                   *str++ = (char)va_arg(vl, int);
                   continue;
                }
                if (c == 's')
                {
                   register const char *p1 = va_arg(vl, const char *);
                   if ((*str = *p1))   // ligne 291
                      while ((*++str = *++p1));
                   continue;
                }
    Merci pour votre aide

    Cdt,
    MC

  2. #2
    Membre très actif Avatar de tim974
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 175
    Par défaut
    C'est bien de donner la fonction, mais un morceau de code directement compilable serait la bienvenue également.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut
    B en fait c'est un fichier d'un ircu (t'chat genre unreal), à lui seul il ne peut pas être exécutable.

    Quand on a des erreurs "Segmentation fault" ça peut venir d'où?

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    La balise code et un peu d'indentation nous montrent que le code posté est incomplet :
    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
    char *vsprintf_irc(register char *str,
                       register const char *format, register va_list vl)
    {
        register char c;
     
        while ((c = *format++)) {
            if (c == '%') {
                c = *format++;      /* May never be '\0' ! */
                if (c == 'c') {
                    *str++ = (char) va_arg(vl, int);
                    continue;
                }
                if (c == 's') {
                    register const char *p1 = va_arg(vl, const char *);
                    if ((*str = *p1))
                        while ((*++str = *++p1));
                    continue;
                }
    Est il possible d'avoir un code qui compile ? De voir comment est appelé vsprintf_irc ?

    Chez moi (cygwin / gcc) le code fonctionne sans trop de problèmes :
    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
    void foo(char * buf, char * format, ...)
    {
        va_list ap;
     
        va_start(ap, format);
        vsprintf_irc(buf, format, ap);
        va_end(ap);
     
        printf(buf);
    }
     
    int main()
    {
        char buf[256] = "";;
        foo(buf, "%c \\o/ %s", '1', "bar");
        return 0;
    }
    Par contre, je récupère un belle erreur de segmentation si la place allouée dans buf est trop faible.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut
    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    char *vsprintf_irc(register char *str,
        register const char *format, register va_list vl)
    {
      register char c;
     
      while ((c = *format++))
      {
        if (c == '%')
        {
          c = *format++;		/* May never be '\0' ! */
          if (c == 'c')
          {
    	*str++ = (char)va_arg(vl, int);
    	continue;
          }
          if (c == 's')
          {
    	register const char *p1 = va_arg(vl, const char *);
    	if ((*str = *p1))
    	  while ((*++str = *++p1));
    	continue;
          }
          if (c == 'l' && *format == 'u')	/* Prints time_t value in interval
    					   [ 100000000 , 4294967295 ]
    					   Actually prints like "%09lu" */
          {
    	register unsigned long v1, v2;
    	register const char *ap;
    	++format;
    	v1 = va_arg(vl, unsigned long);
    	if (v1 > 999999999L)
    	{
    	  v2 = v1 / 1000000000;
    	  v1 -= v2 * 1000000000;
    	  *str++ = '0' + v2;
    	}
    	v2 = v1 / 1000000;
    	v1 -= v2 * 1000000;
    	ap = atoi_tab + (v2 << 2);
    	*str++ = *ap++;
    	*str++ = *ap++;
    	*str++ = *ap;
    	v2 = v1 / 1000;
    	v1 -= v2 * 1000;
    	ap = atoi_tab + (v2 << 2);
    	*str++ = *ap++;
    	*str++ = *ap++;
    	*str++ = *ap;
    	ap = atoi_tab + (v1 << 2);
    	*str++ = *ap++;
    	*str++ = *ap++;
    	*str++ = *ap;
    	continue;
          }
    #if 0				/* Not used */
          if (c == 'N')		/* Prints "%03u" a numeric value in the
    				   range [ 0, 999 ], padded with zero's */
          {
    	register unsigned int v1;
    	register const char *ap;
    	v1 = va_arg(vl, unsigned int);
    	ap = atoi_tab + (v1 << 2);
    	*str++ = *ap++;
    	*str++ = *ap++;
    	*str++ = *ap;
    	continue;
          }
    #endif
          if (c == 'd')
          {
    	register unsigned int v1, v2;
    	register const char *ap;
    	register char *s = &scratch_buffer[sizeof(scratch_buffer) - 2];
    	v1 = va_arg(vl, int);
    	if ((int)v1 <= 0)
    	{
    	  if (v1 == 0)
    	  {
    	    *str++ = '0';
    	    continue;
    	  }
    	  *str++ = '-';
    	  v1 = -v1;
    	}
    	do
    	{
    	  v2 = v1 / 1000;
    	  ap = atoi_tab + 2 + ((v1 - 1000 * v2) << 2);
    	  *s-- = *ap--;
    	  *s-- = *ap--;
    	  *s-- = *ap;
    	}
    	while ((v1 = v2) > 0);
    	while ('0' == *++s);
    	*str = *s;
    	while ((*++str = *++s));
    	continue;
          }
          if (c == 'u')
          {
    	register unsigned int v1, v2;
    	register const char *ap;
    	register char *s = &scratch_buffer[sizeof(scratch_buffer) - 2];
    	v1 = va_arg(vl, unsigned int);
    	if (v1 == 0)
    	{
    	  *str++ = '0';
    	  continue;
    	}
    	do
    	{
    	  v2 = v1 / 1000;
    	  ap = atoi_tab + 2 + ((v1 - 1000 * v2) << 2);
    	  *s-- = *ap--;
    	  *s-- = *ap--;
    	  *s-- = *ap;
    	}
    	while ((v1 = v2) > 0);
    	while ('0' == *++s);
    	*str = *s;
    	while ((*++str = *++s));
    	continue;
          }
          if (c != '%')
          {
    	format -= 2;
    	str += vsprintf(str, format, vl);
    	break;
          }
        }
        *str++ = c;
      }
      *str = 0;
      return str;
    }
     
    char *sprintf_irc(register char *str, const char *format, ...)
    {
     va_list vl;
      register char *ret;
      va_start(vl, format);
      ret = vsprintf_irc(str, format, vl);
      va_end(vl);
      return ret;
    }
    Elle est appelée comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vsprintf_irc(nbuf + strlen(nbuf), pattern, vl);
    Merci pour votre aide

  6. #6
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par Micr0be Voir le message
    Elle est appelée comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vsprintf_irc(nbuf + strlen(nbuf), pattern, vl);
    Merci pour votre aide
    Que vaut nbuf? pattern? vl?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut
    La fonction est appelée par une autre 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    static void vsendto_prefix_one(register aClient *to, register aClient *from,
        char *pattern, va_list vl)
    {
      if (to && from && MyUser(to) && IsUser(from))
      {
        static char sender[HOSTLEN + NICKLEN + USERLEN + 5];
        char *par;
        int flag = 0;
        Reg3 anUser *user = from->user;
     
        par = va_arg(vl, char *);
        strcpy(sender, from->name);
        if (user)
        {
          if (*user->username)
          {
                      strcat(sender, "!");
                      strcat(sender, user->username);
          }
          if (*user->host && !MyConnect(from))
          {
                      strcat(sender, "@");
                      strcat(sender, hostprot(user));
                      flag = 1;
          }
        }
        if (!flag && MyConnect(from) && *user->host)
        {
          strcat(sender, "@");
          strcat(sender, hostprot(user));
        }
        *sendbuf = ':';
        strcpy(&sendbuf[1], sender);
        vsprintf_irc(sendbuf + strlen(sendbuf), &pattern[3], vl);
      }
      else
      vsprintf_irc(sendbuf, pattern, vl);
      sendbufto_one(to);
    }
    Le problème de segmentation peut venir uniquement du nbuf trop faible?

  8. #8
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Micr0be Voir le message
    Elle est appelée comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vsprintf_irc(nbuf + strlen(nbuf), pattern, vl);
    Merci pour votre aide
    Hum et qu'y a-t-il dans ces champs ?

    Remarque : la valeur renvoyée par la fonction est la position dans le str où on peut continuer à écrire. En général (A mon avis, c'est même un comportement standard), ce genre de fonction renvoie le nombre de caractères écrits dans le buffer.

    Ceci peut avoir des effets de bords importants.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut
    Au moment du crash, elles avaient ces valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #0  vsprintf_irc (str=0x64c525 "#!Accueil!\r\n", format=0x438b6d "", vl=0x7fff48d252a0) at sprintf_irc.c:291

  10. #10
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Micr0be Voir le message
    Au moment du crash, elles avaient ces valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #0  vsprintf_irc (str=0x64c525 "#!Accueil!\r\n", format=0x438b6d "", vl=0x7fff48d252a0) at sprintf_irc.c:291
    Donc, on peut en déduire que str contenait "#!Acceuil!\r\n", format contenait "\0", mais avec toute la bonne volonté de la terre, je ne peut pas deviner ce qui ce cache dans vl. (A part un conflit 32 / 64 bits, l'adresse 0x7fff48d252a0 me parle très peu)

    Par contre, si on regarde la première trace, on voit que pattern contient ":%s PART %s", format qui pointe sur &pattern[3] devrait contenir " PART %s"... ce qui n'est pas le cas.
    Il y a un truc de louche dans la trace non ?

    Que donne une exécution pas à pas dans vsprintf_irc ?

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut
    vl contenait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (gdb) print vl
    $2 = (struct __va_list_tag *) 0x7fff48d252a0
    Mais je n'arrive pas à le trouver dans le programme

    Je ne sais pas bien me servir de gdb

    Si tu as du temps à me consacrer je veux bien te donner les access de la box pour que tu puisses y jeter un œil

  12. #12
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Micr0be
    Mais je n'arrive pas à le trouver dans le programme
    Cherche la fonction dans laquelle est appelée la macro va_start.

    Citation Envoyé par Micr0be
    Si tu as du temps à me consacrer
    Pas plus que ça

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut
    Celle la? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char *sprintf_irc(register char *str, const char *format, ...)
    {
     va_list vl;
      register char *ret;
      va_start(vl, format);
      ret = vsprintf_irc(str, format, vl);
      va_end(vl);
      return ret;
    }

  14. #14
    Invité(e)
    Invité(e)
    Par défaut
    Oui,

    Avec quels paramètres est appelée sprintf_irc ?

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ./opercmds.c:       sprintf_irc(port, "%u", aconf->port);
    ./opercmds.c:    sprintf_irc(tbuf, "%lu", TStime());
    ./opercmds.c:    sprintf_irc(tbuf, "%lu", TStime());
    ./opercmds.c:    sprintf_irc(timebuf, "%d",
    ./opercmds.c:    sprintf_irc(timebuf, "%d %d", tv.tv_sec, tv.tv_usec);
    ./opercmds.c:  sprintf_irc(logbuf, "# %lu %s adding %s GLINE for %s@%s, expiring at "
    ./opercmds.c:  sprintf_irc(logbuf, "%c:%s:%s:%s\n", ip_mask ? 'k' : 'K', host, comment, user);
    ./opercmds.c:   sprintf_irc(logbuf, "# %lu %s removing GLINE for %s@%s\n", TStime(),
    ./opercmds.c:     sprintf_irc(logbuf, "# %lu %s resetting expiration time on GLINE "
    ./opercmds.c:   sprintf_irc(logbuf, "# %lu %s!%s@%s removed local GLINE for %s@%s",
    Mais je pense pas que ça vienne de lui sinon ça serait dans le gdb no?

  16. #16
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Micr0be Voir le message
    Mais je pense pas que ça vienne de lui sinon ça serait dans le gdb no?
    Oui, en effet, je m'égare...

    va_start est il appelé dans une autre fonction ? Une des fonctions affichées dans la trace ?

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut
    Non

  18. #18
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Micr0be Voir le message
    Non
    Hum, je ne suis pas sur qu'un appel à va_arg fonctionne si va_start n'a pas été appelé avant. (Ni même que ça ait un sens).

    Peux tu dire où est créé la variable va_list vl ? (le même qui est paramètre de vsprintf_irc et vsendto_prefix_one) en toute logique (si on lit bien la trace) il devrait être créé dans sendto_channel_butserv.

    Sinon, voir ce post.
    Dernière modification par Invité(e) ; 27/08/2008 à 18h03.

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut
    Elle est bien créé ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void sendto_channel_butserv(aChannel *chptr, aClient *from, char *pattern, ...)
    {
      va_list vl;
      Reg1 Link *lp;
      Reg2 aClient *acptr;
     
      for (va_start(vl, pattern), lp = chptr->members; lp; lp = lp->next)
        if (MyConnect(acptr = lp->value.cptr) && !(lp->flags & CHFL_ZOMBIE))
          vsendto_prefix_one(acptr, from, pattern, vl);
      va_end(vl);
      return;
    }
    Mais quel est le rapprochement?

  20. #20
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Micr0be Voir le message
    Elle est bien créé ici :
    Bien, alors quels sont les paramètres de sendto_channel_butserv ? (les paramètres qui m'interressent sont pattern et ceux qui suivent, pas les deux premiers)

    Citation Envoyé par Micr0be Voir le message
    Mais quel est le rapprochement?
    Bah je tente de comprendre pourquoi ça crashe.
    Pour reproduire le problème chez moi, j'ai besoin de savoir ce qu'il y avait dans la pile au moment de l'appel à va_start. Donc de savoir quels étiant les paramètres de la function sendto_channel_butserv apuisse que c'est elle qui appelle va_start.

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/12/2013, 09h19
  2. Réponses: 2
    Dernier message: 23/04/2012, 23h07
  3. Réponses: 2
    Dernier message: 07/03/2010, 00h20
  4. Réponses: 0
    Dernier message: 10/01/2008, 23h28
  5. Réponses: 15
    Dernier message: 15/04/2007, 13h31

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