Package home | Report new bug | New search | Development Roadmap Status: Open | Feedback | All | Closed Since Version 0.1.7

Bug #17381 infinite loop in __destruct of generated parser
Submitted: 2010-05-08 02:47 UTC
From: thue Assigned: jespino
Status: Closed Package: PHP_ParserGenerator (version 0.1.6)
PHP Version: Irrelevant OS: All
Roadmaps: (Not assigned)    
Subscription  
Comments Add Comment Add patch


Anyone can comment on a bug. Have a simpler test case? Does it work for you on a different platform? Let us know! Just going to say 'Me too!'? Don't clutter the database with that please !
Your email address:
MUST BE VALID
Solve the problem : 27 + 32 = ?

 
 [2010-05-08 02:47 UTC] thue (Thue Kristensen)
Description: ------------ The __destruct() of the generated parser can go into an infinite loop. Test script: --------------- # cat test.php %name TEST_ %token_prefix TEST_ %declare_class {class test} %include { $a = new test(); $a->lala(); } %include_class { public function lala() { exit(1); } } start ::= . # cat create_parser.php require_once(dirname(__FILE__)."/../../../../lib/parser_generator/ParserGenerator.php"); $parser = new PHP_ParserGenerator(); $parser->main(); # php create_parser.php test.y Expected result: ---------------- Program terminates... Actual result: -------------- Infinite loop in the __destruct code while ($this->yyidx >= 0) { $this->yy_pop_parser_stack(); } since $this->yyidx===0 and $this->yystack===Array(), and $this->yy_pop_parser_stack(); does if (!count($this->yystack)) { return; }

Comments

 [2010-08-07 03:28 UTC] jespino (Jesús Espino)
I think this is a duplication of bug #12730.
 [2010-08-08 00:17 UTC] thue (Thue Kristensen)
Agreed. But mine has a test case :). In any case, it is trivial to fix. #12730 has a fix, and I have a (slightly better, perhaps) fix in my private tree.
 [2010-08-08 20:47 UTC] jespino (Jesús Espino)
Please, add the patch here to apply it to the package.
 [2010-08-08 23:08 UTC] thue (Thue Kristensen)
My fix was simply to use $this->yystack !== Array() for checking whether the stack was empty, instead $yyidx . This way, it will not go into an infinite loop even if $yyidx gets out of sync. Something like while ($this->yystack !== Array()) { $this->yy_pop_parser_stack(); }
 [2010-08-09 00:40 UTC] jespino (Jesús Espino)
-Status: Open +Status: Closed -Assigned To: +Assigned To: jespino
This bug has been fixed in SVN. If this was a documentation problem, the fix will appear on pear.php.net by the end of next Sunday (CET). If this was a problem with the pear.php.net website, the change should be live shortly. Otherwise, the fix will appear in the package's next release. Thank you for the report and for helping us make PEAR better. Applied the patch of Thue Kristensen