php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #70210 Parser: some ASTs may get wrong line numbers
Submitted: 2015-08-07 23:31 UTC Modified: 2015-08-08 06:32 UTC
Votes:4
Avg. Score:2.0 ± 1.0
Reproduced:0 of 2 (0.0%)
From: duckki at synopsys dot com Assigned: nikic (profile)
Status: Assigned Package: *Compile Issues
PHP Version: 7.0.0beta3 OS:
Private report: No CVE-ID: None
View Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
If you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: duckki at synopsys dot com
New email:
PHP Version: OS:

 

 [2015-08-07 23:31 UTC] duckki at synopsys dot com
Description:
------------
I've noticed some AST nodes (arrays, ++, yield, etc.) may have the wrong line numbers. Here's an example PHP code:

1: <?php
2: yield
3: 
4: // gap
5: 
6: function() { yield; };

PHP 7.0.0beta3 will report:

Fatal error: The "yield" expression can only be used inside a function in wrong-line-number.php on line 6

That message is wrong. The yield on line 6 is correct. The fatal error is actually on line 2.

We can see the AST has the wrong line number. Here's the output from php-ast.

AST_STMT_LIST @ 1
    0: AST_YIELD @ 6
        0: AST_CLOSURE @ 6-6
            flags: 0
            name: {closure}
            0: AST_PARAM_LIST @ 6
            1: null
            2: AST_STMT_LIST @ 6
                0: AST_YIELD @ 6
                    0: null
                    1: null
            3: null
        1: null

The first AST_YIELD has the line number 6. After quick inspection, I see the parser often delay the construction of AST node and capture the line number after parsing 1~2 tokens, which may be a line or more below the actual beginning of the AST node.

The consequences are incorrect line numbers from runtime errors.


Test script:
---------------
<?php
yield

// gap

function() { yield; };


Expected result:
----------------
Fatal error: The "yield" expression can only be used inside a function in wrong-line-number.php on line 2

Actual result:
--------------
Fatal error: The "yield" expression can only be used inside a function in wrong-line-number.php on line 6

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2015-08-08 06:32 UTC] nikic@php.net
Related to: https://bugs.php.net/bug.php?id=70024

This would be fixed by using bison location tracking.
 [2015-08-08 06:32 UTC] nikic@php.net
-Assigned To: +Assigned To: nikic
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Dec 03 17:01:29 2024 UTC