Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2829 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [flex/bison][résolu] invalid pointer

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[flex/bison][résolu] invalid pointer

n°2084593
shaoyin
Posté le 24-06-2011 à 14:24:59  profilanswer
 

Bonjour,
 
J'essaie de créer un parser avec flex/bison et je rencontre deux erreurs curieuses.  
 
1) Le programme se plante violemment avec un message "*** glibc detected *** ./parser: free(): invalid pointer: 0x08cd5770 ***", suivi de tout un tas d'infos plus ou moins inutiles (Backtrace et Memory map).  
Dans le fichier analysé par le parser, la ligne qui engendre le problème se termine par un nombre entier. Si j'ajoute un espace immédiatement derrière le nombre, le programme se déroule normalement. C'est d'autant plus curieux, parce que le fichier comporte des tas d'autres lignes qui se terminent par un nombre, mais pour celles-ci l'absence d'espace derrière ne semble pas constituer de problème.
 
2) Mon parser est (normalement) insensible aux caractères de fin de ligne. Le fichier analysé est un fichier texte au format "dos", donc avec CRLF comme indicateur de fin de ligne. Si je convertis le fichier au format "unix", donc avec juste LF comme caractère de fin de ligne, le problème disparait !!!
 
Voici un extrait de mon fichier de définition des lexèmes :

Code :
  1. entier   [-]?[0-9]+
  2. entier_CR  [-]?[0-9]+"\r"
  3. blanc   [ \t]
  4. saut_de_ligne "\n"
  5. %%
  6. "\r"   {  }
  7. {saut_de_ligne} {  }
  8. {entier}  { std::stringstream ss; ss << yytext; ss >> yylval.v_entier; return lex_entier; }
  9. {entier_CR} { REJECT; }

Je précise que les lignes 2 et 12 n'existaient pas initialement, et que le motif "saut_de_ligne" était initialement l'expression régulière "\r?\n". Mais quoi que je modifie, cela n'a pas l'air de changer grand chose au résultat...
:sweat:  
 
Est-ce que cela vous inspire quelque chose ?
 
Merci d'avance !


Message édité par shaoyin le 24-06-2011 à 16:00:44
mood
Publicité
Posté le 24-06-2011 à 14:24:59  profilanswer
 

n°2084663
olivthill
Posté le 24-06-2011 à 15:59:34  profilanswer
 

Est-ce que les guillemets sont nécessaires autour de "\r" ?
 
Peut-être y aurait-il une confusion à cause du signe plus, +, qui n'indique pas une concaténation dans les regexp, mais qui est presque la même chose que l'étoile, *.
 
Peut-être pour la ligne 2, faudrait-il essayer :

entier_CR  [-]?[0-9]+$\r


n°2084680
shaoyin
Posté le 24-06-2011 à 16:13:38  profilanswer
 

Merci pour ta réponse !  :)  
 
En fait, j'ai trouvé l'origine du problème : un bug dans le traitement d'une ligne précédente du fichier, qui provoquait un débordement de buffer d'un octet. Trop peu pour faire planter le programme tout de suite, mais suffisamment pour introduire une bombe à retardement...
 
Je dois dire que je me doutais un peu que le problème devait venir de moi, il aurait été surprenant que des symptômes aussi tordus soient issus de flex/bison.
 
Pour répondre à tes questions, les guillemets autour de \r sont tout à fait corrects. Cela dit, ils sont peut-être aussi optionnels !
Dans l'outil flex , le '+' signifie "au moins une occurrence".


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [flex/bison][résolu] invalid pointer

 

Sujets relatifs
Probleme avec un LineSeries affichant 3000 valeurs en Flex[C++] Vector class et pointer
Compilation Flex+Javafree() invalid next size(fast)
besoin explication flex - flash concernant les classesPreprocessing & dereferencing pointer
erreur keytool : java.io.IOException: Invalid keystore formatProgrammation Flex getVideo
Possibilité du Flash/flex - CS3Flash/Flex/ActionScript, petite explication
Plus de sujets relatifs à : [flex/bison][résolu] invalid pointer


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR