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

invalid pointer [flex/bison][résolu] - C++ - Programmation

Marsh Posté le 24-06-2011 à 14:24:59    

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
Reply

Marsh Posté le 24-06-2011 à 14:24:59   

Reply

Marsh Posté le 24-06-2011 à 15:59:34    

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


Reply

Marsh Posté le 24-06-2011 à 16:13:38    

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".

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed