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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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