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 :

Longueur maximal d'une chaine definie dans define


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Par défaut Longueur maximal d'une chaine definie dans define
    Bonjour,

    J'ai développé un module pour Apache 2.2.4 et je rencontre un comportement aléatoire quand je modifie la valeur d'une variable défini à l'aide de #define. Cette variable me sert à définir une expression régulière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define EXP_REGU "<\\?xml version=\"1\\.0\" encoding=\"UTF-8\"\\?><endbRequest xmlns=\"UdbEndbInterface\" xmlns:xsi=\"http://www\\.w3\\.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"EndbInterface C:[\\]{1,2}endbRequest\\.xsd\"><Line-Id>(.{0}|[[:alnum:]]{20})</Line-Id><Operator-Code>(.{0}|[0-9]{2})</Operator-Code><Country-Code>(.{0}|[0-9]{2})</Country-Code><Location-Area-Code>(.{0}|[0-9]{5})</Location-Area-Code><Advanced-Location-Info>(.{0}|[[:alnum:]]{10})</Advanced-Location-Info><Calling>([0-9]{9,11})</Calling><Called>([0-9]{2,6})</Called></endbRequest>"
    ==> Là, tout fonctionne parfaitement

    Je modifie légèrement le bazard (faire défiler à droite...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define EXP_REGU "<\\?xml version=\"1\\.0\" encoding=\"UTF-8\"\\?><endbRequest xmlns=\"UdbEndbInterface\" xmlns:xsi=\"http://www\\.w3\\.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"EndbInterface C:[\\]{1,2}endbRequest\\.xsd\"><Line-Id>(.{0}|[[:alnum:]]{20})</Line-Id><Operator-Code>(.{0}|[0-9]{2})</Operator-Code><Country-Code>(.{0}|[0-9]{2})</Country-Code><Location-Area-Code>(.{0}|[0-9]{5})</Location-Area-Code><Advanced-Location-Info>(.{0}|[[:alnum:]]{10})</Advanced-Location-Info><Calling>([0-9]{9,11})</Calling><Called>([0-9]{2,8})</Called></endbRequest>"
    ==> Au lancement Apache sort en Segmentation Fault

    D'après gdb (debuger GNU), l'erreur viendrait du noyau Apache lui même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    624     in main.c
    (gdb) n
     
    Program received signal SIGSEGV, Segmentation fault.
    0x001b5f70 in _int_malloc () from /lib/tls/libc.so.6
    (gdb) bt
    #0  0x001b5f70 in _int_malloc () from /lib/tls/libc.so.6
    #1  0x001b50fd in malloc () from /lib/tls/libc.so.6
    #2  0x00ef4722 in allocator_alloc (allocator=0x8aed008, size=8192) at memory/unix/apr_pools.c:300
    #3  0x00ef3c27 in apr_pool_create_ex (newpool=0xbfffb4a8, parent=0x8af30a8, abort_fn=0, allocator=0x8aed008) at memory/unix/apr_pools.c:800
    #4  0x080695c8 in ap_core_reorder_directories (p=0x8af30a8, s=0x2009) at core.c:631
    #5  0x0806244d in main (argc=4, argv=0xbfffb5a4) at main.c:624
    Impossible de m'expliquer le pourquoi du comment...

    Je me demandais donc si le contenu de la variable défini par le #define ne partait pas quelque part en mémoire et débordait quelque part...

    Existe-t-il une longueur maximum pour une variable défini par #define ?

    Merci d'avance pour votre aide

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cheprod Voir le message
    Bonjour,

    J'ai développé un module pour Apache 2.2.4 et je rencontre un comportement aléatoire quand je modifie la valeur d'une variable défini à l'aide de #define. Cette variable me sert à définir une expression régulière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define EXP_REGU "<\\?xml version=\"1\\.0\" encoding=\"UTF-8\"\\?><endbRequest xmlns=\"UdbEndbInterface\" xmlns:xsi=\"http://www\\.w3\\.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"EndbInterface C:[\\]{1,2}endbRequest\\.xsd\"><Line-Id>(.{0}|[[:alnum:]]{20})</Line-Id><Operator-Code>(.{0}|[0-9]{2})</Operator-Code><Country-Code>(.{0}|[0-9]{2})</Country-Code><Location-Area-Code>(.{0}|[0-9]{5})</Location-Area-Code><Advanced-Location-Info>(.{0}|[[:alnum:]]{10})</Advanced-Location-Info><Calling>([0-9]{9,11})</Calling><Called>([0-9]{2,6})</Called></endbRequest>"
    ==> Là, tout fonctionne parfaitement

    Je modifie légèrement le bazard (faire défiler à droite...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define EXP_REGU "<\\?xml version=\"1\\.0\" encoding=\"UTF-8\"\\?><endbRequest xmlns=\"UdbEndbInterface\" xmlns:xsi=\"http://www\\.w3\\.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"EndbInterface C:[\\]{1,2}endbRequest\\.xsd\"><Line-Id>(.{0}|[[:alnum:]]{20})</Line-Id><Operator-Code>(.{0}|[0-9]{2})</Operator-Code><Country-Code>(.{0}|[0-9]{2})</Country-Code><Location-Area-Code>(.{0}|[0-9]{5})</Location-Area-Code><Advanced-Location-Info>(.{0}|[[:alnum:]]{10})</Advanced-Location-Info><Calling>([0-9]{9,11})</Calling><Called>([0-9]{2,8})</Called></endbRequest>"
    ==> Au lancement Apache sort en Segmentation Fault

    D'après gdb (debuger GNU), l'erreur viendrait du noyau Apache lui même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    624     in main.c
    (gdb) n
     
    Program received signal SIGSEGV, Segmentation fault.
    0x001b5f70 in _int_malloc () from /lib/tls/libc.so.6
    (gdb) bt
    #0  0x001b5f70 in _int_malloc () from /lib/tls/libc.so.6
    #1  0x001b50fd in malloc () from /lib/tls/libc.so.6
    #2  0x00ef4722 in allocator_alloc (allocator=0x8aed008, size=8192) at memory/unix/apr_pools.c:300
    #3  0x00ef3c27 in apr_pool_create_ex (newpool=0xbfffb4a8, parent=0x8af30a8, abort_fn=0, allocator=0x8aed008) at memory/unix/apr_pools.c:800
    #4  0x080695c8 in ap_core_reorder_directories (p=0x8af30a8, s=0x2009) at core.c:631
    #5  0x0806244d in main (argc=4, argv=0xbfffb5a4) at main.c:624
    Impossible de m'expliquer le pourquoi du comment...

    Je me demandais donc si le contenu de la variable défini par le #define ne partait pas quelque part en mémoire et débordait quelque part...

    Existe-t-il une longueur maximum pour une variable défini par #define ?

    Merci d'avance pour votre aide
    Bah le mieux est que tu demandes au compilo de s'arrter au ".i" pour que t'ailles voir comment le préprocesseur à traduit ton define
    gcc -E source.c >source.i
    indent -bl -nce -npro source.i
    Et tu vas voir "source.i" ce qu'il contient

    Sinon perso j'ai tapé le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #define EXP_REGU "<\\?xml version=\"1\\.0\" encoding=\"UTF-8\"\\?><endbRequest xmlns=\"UdbEndbInterface\" xmlns:xsi=\"http://www\\.w3\\.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"EndbInterface C:[\\]{1,2}endbRequest\\.xsd\"><Line-Id>(.{0}|[[:alnum:]]{20})</Line-Id><Operator-Code>(.{0}|[0-9]{2})</Operator-Code><Country-Code>(.{0}|[0-9]{2})</Country-Code><Location-Area-Code>(.{0}|[0-9]{5})</Location-Area-Code><Advanced-Location-Info>(.{0}|[[:alnum:]]{10})</Advanced-Location-Info><Calling>([0-9]{9,11})</Calling><Called>([0-9]{2,6})</Called></endbRequest>"
     
    #include <stdio.h>
    int main()
    {
    	printf("exp=[%s]\n", EXP_REGU);
    }
    Ca marche aussi bien avec 6 que 8
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Par défaut
    Merci pour le test

    J'ai porté le pavé de texte vers un variable de type "const char *" mais j'ai le même problème...

    Je vais continuer d'investiguer car le problème doit être plus sérieux

Discussions similaires

  1. Effacer une chaine contenue dans une zone text
    Par johnnywalker dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/04/2007, 12h52
  2. Insertion d'une chaine vide dans un double
    Par root76 dans le forum Langage
    Réponses: 9
    Dernier message: 05/01/2007, 15h49
  3. Executer une chaine concatener dans une procedure stockée
    Par nic413 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 19/06/2006, 10h24
  4. Taille maximal d'une chaine de caractère...
    Par nguthans dans le forum Langage
    Réponses: 1
    Dernier message: 01/03/2006, 16h58
  5. [IO]Récupérer une chaine texte dans un flux HTTP
    Par elitost dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 16/03/2005, 10h39

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