Skip to content

Commit be271f2

Browse files
committed
Fix bug #81652
We need to check not only for defs but also for uses of the variable.
1 parent b29e85a commit be271f2

File tree

3 files changed

+34
-13
lines changed

3 files changed

+34
-13
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ PHP NEWS
4949

5050
- Opcache:
5151
. Fixed bug #81512 (Unexpected behavior with arrays and JIT). (Dmitry)
52+
. Fixed bug #81652 (The value of error_reporting() gets overridden). (Nikita)
5253

5354
- PCRE:
5455
. Fixed bug #81424 (PCRE2 10.35 JIT performance regression). (cmb)

Zend/tests/bug81652.phpt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
Bug #81652: The value of error_reporting() gets overridden
3+
--FILE--
4+
<?php
5+
6+
class Foo {
7+
public $a;
8+
9+
public function bar() {
10+
$this->a = true ? @random_int(0, 100) : false;
11+
}
12+
}
13+
14+
var_dump(error_reporting());
15+
$c = new Foo();
16+
$c->bar();
17+
var_dump(error_reporting());
18+
19+
?>
20+
--EXPECT--
21+
int(32767)
22+
int(32767)

ext/opcache/Optimizer/dfa_pass.c

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -360,19 +360,17 @@ static zend_bool opline_supports_assign_contraction(
360360
return 1;
361361
}
362362

363-
static bool variable_redefined_in_range(zend_ssa *ssa, int var, int start, int end)
363+
static bool variable_defined_or_used_in_range(zend_ssa *ssa, int var, int start, int end)
364364
{
365365
while (start < end) {
366-
if (ssa->ops[start].op1_def >= 0
367-
&& ssa->vars[ssa->ops[start].op1_def].var == var) {
368-
return 1;
369-
}
370-
if (ssa->ops[start].op2_def >= 0
371-
&& ssa->vars[ssa->ops[start].op2_def].var == var) {
372-
return 1;
373-
}
374-
if (ssa->ops[start].result_def >= 0
375-
&& ssa->vars[ssa->ops[start].result_def].var == var) {
366+
const zend_ssa_op *ssa_op = &ssa->ops[start];
367+
if ((ssa_op->op1_def >= 0 && ssa->vars[ssa_op->op1_def].var == var) ||
368+
(ssa_op->op2_def >= 0 && ssa->vars[ssa_op->op2_def].var == var) ||
369+
(ssa_op->result_def >= 0 && ssa->vars[ssa_op->result_def].var == var) ||
370+
(ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].var == var) ||
371+
(ssa_op->op2_use >= 0 && ssa->vars[ssa_op->op2_use].var == var) ||
372+
(ssa_op->result_use >= 0 && ssa->vars[ssa_op->result_use].var == var)
373+
) {
376374
return 1;
377375
}
378376
start++;
@@ -1310,7 +1308,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
13101308
&& opline_supports_assign_contraction(
13111309
ssa, &op_array->opcodes[ssa->vars[src_var].definition],
13121310
src_var, opline->result.var)
1313-
&& !variable_redefined_in_range(ssa, EX_VAR_TO_NUM(opline->result.var),
1311+
&& !variable_defined_or_used_in_range(ssa, EX_VAR_TO_NUM(opline->result.var),
13141312
ssa->vars[src_var].definition+1, op_1)
13151313
) {
13161314

@@ -1467,7 +1465,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
14671465
&& opline_supports_assign_contraction(
14681466
ssa, &op_array->opcodes[ssa->vars[src_var].definition],
14691467
src_var, opline->op1.var)
1470-
&& !variable_redefined_in_range(ssa, EX_VAR_TO_NUM(opline->op1.var),
1468+
&& !variable_defined_or_used_in_range(ssa, EX_VAR_TO_NUM(opline->op1.var),
14711469
ssa->vars[src_var].definition+1, op_1)
14721470
) {
14731471

0 commit comments

Comments
 (0)