Skip to content

Commit 7e8257f

Browse files
committed
Disable ASSIGN optimization for values inferred for fatal errors.
1 parent 90ca8f9 commit 7e8257f

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

Zend/Optimizer/dfa_pass.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1356,6 +1356,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
13561356

13571357
if (src_var >= 0
13581358
&& !(ssa->var_info[src_var].type & MAY_BE_REF)
1359+
&& (ssa->var_info[src_var].type & (MAY_BE_UNDEF|MAY_BE_ANY))
13591360
&& ssa->vars[src_var].definition >= 0
13601361
&& ssa->ops[ssa->vars[src_var].definition].result_def == src_var
13611362
&& ssa->ops[ssa->vars[src_var].definition].result_use < 0
@@ -1513,6 +1514,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
15131514
if ((opline->op2_type & (IS_TMP_VAR|IS_VAR))
15141515
&& src_var >= 0
15151516
&& !(ssa->var_info[src_var].type & MAY_BE_REF)
1517+
&& (ssa->var_info[src_var].type & (MAY_BE_UNDEF|MAY_BE_ANY))
15161518
&& ssa->vars[src_var].definition >= 0
15171519
&& ssa->ops[ssa->vars[src_var].definition].result_def == src_var
15181520
&& ssa->ops[ssa->vars[src_var].definition].result_use < 0

ext/opcache/tests/jit/assign_051.phpt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
JIT ASSIGN: incorrect assignment optimization
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_update_protection=0
7+
opcache.jit_buffer_size=1M
8+
opcache.protect_memory=1
9+
--FILE--
10+
<?php
11+
function foo(int $a) {
12+
$arr = $a[] = (y);
13+
$arr = y;
14+
$c = $y = $arr = &y($c);
15+
}
16+
foo(0);
17+
?>
18+
--EXPECTF--
19+
Fatal error: Uncaught Error: Undefined constant "y" in %sassign_051.php:3
20+
Stack trace:
21+
#0 %sassign_051.php(7): foo(0)
22+
#1 {main}
23+
thrown in %sassign_051.php on line 3

0 commit comments

Comments
 (0)