Skip to content

Commit

Permalink
Fix trailing if element JMP lineno
Browse files Browse the repository at this point in the history
Having this lineno on the same last compiled element can lead to an incorrectly
covered line number.

if (true) {
    if (false) {
        echo 'Never executed';
    }
} else {
}

The echo will be reported as covered because the JMP from the if (true) branch
to the end of the else branch has the same lineno as the echo.

This is lacking a test because zend_dump.c does not have access to
ctx->debug_level and I don't think it's worth adjusting all the cases.

Closes GH-11598
  • Loading branch information
iluuu1994 committed Jul 5, 2023
1 parent 80153c9 commit a5e89c5
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 0 deletions.
1 change: 1 addition & 0 deletions NEWS
Expand Up @@ -11,6 +11,7 @@ PHP NEWS
- Core:
. Fixed oss-fuzz #60011 (Mis-compilation of by-reference nullsafe operator).
(ilutov)
. Fixed line number of JMP instruction over else block. (ilutov)

- Date:
. Fixed bug GH-11368 (Date modify returns invalid datetime). (Derick)
Expand Down
3 changes: 3 additions & 0 deletions Zend/zend_compile.c
Expand Up @@ -5420,6 +5420,9 @@ static void zend_compile_if(zend_ast *ast) /* {{{ */
zend_compile_stmt(stmt_ast);

if (i != list->children - 1) {
/* Set the lineno of JMP to the position of the if keyword, as we don't want to
* report the last line in the if branch as covered if it hasn't actually executed. */
CG(zend_lineno) = elem_ast->lineno;
jmp_opnums[i] = zend_emit_jump(0);
}
zend_update_jump_target_to_next(opnum_jmpz);
Expand Down

0 comments on commit a5e89c5

Please sign in to comment.