From 11a9b036a8b01a386dc76bf019f35394e57dc543 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 5 Oct 2021 15:49:43 +0200 Subject: [PATCH] Fix duplicate undef warning in assign_dim_op In case of auto-vivification we were fetching dim twice and as such also emitting the undef var warning twice. --- Zend/tests/assign_dim_op_undef.phpt | 17 +++++++++++++++ Zend/zend_vm_def.h | 4 ++-- Zend/zend_vm_execute.h | 32 ++++++++++++++--------------- 3 files changed, 35 insertions(+), 18 deletions(-) create mode 100644 Zend/tests/assign_dim_op_undef.phpt diff --git a/Zend/tests/assign_dim_op_undef.phpt b/Zend/tests/assign_dim_op_undef.phpt new file mode 100644 index 00000000000..187aed97857 --- /dev/null +++ b/Zend/tests/assign_dim_op_undef.phpt @@ -0,0 +1,17 @@ +--TEST-- +Compound array assign with undefined variables +--FILE-- + +--EXPECTF-- +Warning: Undefined variable $a in %s on line %d + +Warning: Undefined variable $b in %s on line %d + +Warning: Undefined array key "" in %s on line %d +array(1) { + [""]=> + int(1) +} diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d28628c044a..f8566e558c5 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1202,9 +1202,8 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array): } } - dim = GET_OP2_ZVAL_PTR(BP_VAR_R); - if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { + dim = GET_OP2_ZVAL_PTR(BP_VAR_R); if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) { dim++; } @@ -1216,6 +1215,7 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array): ZVAL_ARR(container, zend_new_array(8)); ZEND_VM_C_GOTO(assign_dim_op_new_array); } else { + dim = GET_OP2_ZVAL_PTR(BP_VAR_R); zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); ZEND_VM_C_LABEL(assign_dim_op_ret_null): FREE_OP_DATA(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 329fa827dd4..b7931bd1b81 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -22270,9 +22270,8 @@ assign_dim_op_new_array: } } - dim = RT_CONSTANT(opline, opline->op2); - if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { + dim = RT_CONSTANT(opline, opline->op2); if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) { dim++; } @@ -22284,6 +22283,7 @@ assign_dim_op_new_array: ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { + dim = RT_CONSTANT(opline, opline->op2); zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -24777,9 +24777,8 @@ assign_dim_op_new_array: } } - dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); - if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { + dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) { dim++; } @@ -24791,6 +24790,7 @@ assign_dim_op_new_array: ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { + dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -26958,9 +26958,8 @@ assign_dim_op_new_array: } } - dim = NULL; - if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { + dim = NULL; if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) { dim++; } @@ -26972,6 +26971,7 @@ assign_dim_op_new_array: ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { + dim = NULL; zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -28677,9 +28677,8 @@ assign_dim_op_new_array: } } - dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { + dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) { dim++; } @@ -28691,6 +28690,7 @@ assign_dim_op_new_array: ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { + dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -39265,9 +39265,8 @@ assign_dim_op_new_array: } } - dim = RT_CONSTANT(opline, opline->op2); - if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { + dim = RT_CONSTANT(opline, opline->op2); if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) { dim++; } @@ -39279,6 +39278,7 @@ assign_dim_op_new_array: ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { + dim = RT_CONSTANT(opline, opline->op2); zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -42852,9 +42852,8 @@ assign_dim_op_new_array: } } - dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); - if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { + dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) { dim++; } @@ -42866,6 +42865,7 @@ assign_dim_op_new_array: ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { + dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC); zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -45610,9 +45610,8 @@ assign_dim_op_new_array: } } - dim = NULL; - if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { + dim = NULL; if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) { dim++; } @@ -45624,6 +45623,7 @@ assign_dim_op_new_array: ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { + dim = NULL; zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -47863,9 +47863,8 @@ assign_dim_op_new_array: } } - dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { + dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) { dim++; } @@ -47877,6 +47876,7 @@ assign_dim_op_new_array: ZVAL_ARR(container, zend_new_array(8)); goto assign_dim_op_new_array; } else { + dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC); assign_dim_op_ret_null: FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);