Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Zend/Optimizer/zend_inference.c
Original file line number Diff line number Diff line change
Expand Up @@ -4935,7 +4935,7 @@ ZEND_API zend_result zend_ssa_inference(zend_arena **arena, const zend_op_array
/* }}} */

/* Key types whose conversion to an array offset may emit a diagnostic */
#define MAY_BE_THROWING_KEY (MAY_BE_DOUBLE|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)
#define MAY_BE_THROWING_KEY (MAY_BE_NULL|MAY_BE_DOUBLE|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)

ZEND_API bool zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, const zend_ssa *ssa, uint32_t t1, uint32_t t2)
{
Expand Down Expand Up @@ -5273,7 +5273,7 @@ ZEND_API bool zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op
case ZEND_INIT_ARRAY:
return (opline->op2_type != IS_UNUSED) && (t2 & MAY_BE_THROWING_KEY);
case ZEND_ADD_ARRAY_ELEMENT:
return (opline->op2_type == IS_UNUSED) || (t2 & (MAY_BE_NULL|MAY_BE_THROWING_KEY));
return (opline->op2_type == IS_UNUSED) || (t2 & MAY_BE_THROWING_KEY);
case ZEND_STRLEN:
return (t1 & MAY_BE_ANY) != MAY_BE_STRING;
case ZEND_COUNT:
Expand Down
27 changes: 27 additions & 0 deletions ext/opcache/tests/jit/add_array_element_null_key.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
--TEST--
JIT ADD_ARRAY_ELEMENT: null key conversion may throw
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.jit=function
opcache.file_update_protection=0
--EXTENSIONS--
opcache
--FILE--
<?php
set_error_handler(function ($errno, $errstr) {
throw new Exception($errstr);
});

function test(null $k) {
var_dump([0, $k => 1]);
}

try {
test(null);
} catch (Exception $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
?>
--EXPECT--
Exception: Using null as an array offset is deprecated, use an empty string instead
27 changes: 27 additions & 0 deletions ext/opcache/tests/jit/array_key_exists_null_key.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
--TEST--
JIT ARRAY_KEY_EXISTS: null key conversion may throw
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.jit=function
opcache.file_update_protection=0
--EXTENSIONS--
opcache
--FILE--
<?php
set_error_handler(function ($errno, $errstr) {
throw new Exception($errstr);
});

function test(null $k) {
var_dump(array_key_exists($k, []));
}

try {
test(null);
} catch (Exception $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
?>
--EXPECT--
Exception: Using null as the key parameter for array_key_exists() is deprecated, use an empty string instead
28 changes: 28 additions & 0 deletions ext/opcache/tests/jit/assign_dim_null_key.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
--TEST--
JIT ASSIGN_DIM: null key conversion may throw
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.jit=function
opcache.file_update_protection=0
--EXTENSIONS--
opcache
--FILE--
<?php
set_error_handler(function ($errno, $errstr) {
throw new Exception($errstr);
});

function test(null $k) {
$a = [];
var_dump($a[$k] = 1);
}

try {
test(null);
} catch (Exception $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
?>
--EXPECT--
Exception: Using null as an array offset is deprecated, use an empty string instead
28 changes: 28 additions & 0 deletions ext/opcache/tests/jit/fetch_dim_is_null_key.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
--TEST--
JIT FETCH_DIM_IS: null key conversion may throw
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.jit=function
opcache.file_update_protection=0
--EXTENSIONS--
opcache
--FILE--
<?php
set_error_handler(function ($errno, $errstr) {
throw new Exception($errstr);
});

function test(null $k) {
$a = [];
var_dump($a[$k] ?? 0);
}

try {
test(null);
} catch (Exception $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
?>
--EXPECT--
Exception: Using null as an array offset is deprecated, use an empty string instead
37 changes: 37 additions & 0 deletions ext/opcache/tests/jit/fetch_dim_w_null_key.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
--TEST--
JIT FETCH_DIM_W: null key conversion may throw
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.jit=function
opcache.file_update_protection=0
--EXTENSIONS--
opcache
--FILE--
<?php
set_error_handler(function ($errno, $errstr) {
throw new Exception($errstr);
});

class C {
function __destruct() {
echo "destruct\n";
}
}

function g($x, &$y) {}

function test(null $k) {
$c = new C;
g($c, $a[$k]);
}

try {
test(null);
} catch (Exception $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
?>
--EXPECT--
destruct
Exception: Using null as an array offset is deprecated, use an empty string instead
27 changes: 27 additions & 0 deletions ext/opcache/tests/jit/gh25269.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
--TEST--
GH-25269 (JIT: misaligned zval passed to ZEND_ADD_ARRAY_ELEMENT handler)
--CREDITS--
YuanchengJiang
--EXTENSIONS--
opcache
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.jit_buffer_size=64M
opcache.jit=function
--FILE--
<?php
set_error_handler(function($errno, $errstr) {
throw new ErrorException($errstr);
});
function test() {
return [null => 1, "a" => 2, "b" => 3];
}
try {
test();
} catch (ErrorException $e) {
echo $e->getMessage(), "\n";
}
?>
--EXPECT--
Using null as an array offset is deprecated, use an empty string instead
28 changes: 28 additions & 0 deletions ext/opcache/tests/jit/isset_isempty_dim_obj_null_key.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
--TEST--
JIT ISSET_ISEMPTY_DIM_OBJ: null key conversion may throw
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.jit=function
opcache.file_update_protection=0
--EXTENSIONS--
opcache
--FILE--
<?php
set_error_handler(function ($errno, $errstr) {
throw new Exception($errstr);
});

function test(null $k) {
$a = [];
var_dump(isset($a[$k]));
}

try {
test(null);
} catch (Exception $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
?>
--EXPECT--
Exception: Using null as an array offset is deprecated, use an empty string instead
27 changes: 27 additions & 0 deletions ext/opcache/tests/opt/dce_023.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
--TEST--
DCE must not remove ASSIGN_DIM with a null key
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.optimization_level=-1
opcache.file_update_protection=0
--EXTENSIONS--
opcache
--FILE--
<?php
set_error_handler(function ($errno, $errstr) {
throw new Exception($errstr);
});

function test(null $k) {
$a[$k] = 1;
}

try {
test(null);
} catch (Exception $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
?>
--EXPECT--
Exception: Using null as an array offset is deprecated, use an empty string instead
27 changes: 27 additions & 0 deletions ext/opcache/tests/opt/dce_024.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
--TEST--
DCE must not remove INIT_ARRAY with a null key
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.optimization_level=-1
opcache.file_update_protection=0
--EXTENSIONS--
opcache
--FILE--
<?php
set_error_handler(function ($errno, $errstr) {
throw new Exception($errstr);
});

function test(null $k) {
$a = [$k => 1];
}

try {
test(null);
} catch (Exception $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
?>
--EXPECT--
Exception: Using null as an array offset is deprecated, use an empty string instead
27 changes: 27 additions & 0 deletions ext/opcache/tests/opt/dce_025.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
--TEST--
DCE must not remove ARRAY_KEY_EXISTS with a null key
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.optimization_level=-1
opcache.file_update_protection=0
--EXTENSIONS--
opcache
--FILE--
<?php
set_error_handler(function ($errno, $errstr) {
throw new Exception($errstr);
});

function test(null $k) {
array_key_exists($k, []);
}

try {
test(null);
} catch (Exception $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
?>
--EXPECT--
Exception: Using null as the key parameter for array_key_exists() is deprecated, use an empty string instead
28 changes: 28 additions & 0 deletions ext/opcache/tests/opt/dce_026.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
--TEST--
DCE must not remove ISSET_ISEMPTY_DIM_OBJ with a null key
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.optimization_level=-1
opcache.file_update_protection=0
--EXTENSIONS--
opcache
--FILE--
<?php
set_error_handler(function ($errno, $errstr) {
throw new Exception($errstr);
});

function test(null $k) {
$a = [];
isset($a[$k]);
}

try {
test(null);
} catch (Exception $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
?>
--EXPECT--
Exception: Using null as an array offset is deprecated, use an empty string instead
28 changes: 28 additions & 0 deletions ext/opcache/tests/opt/dce_027.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
--TEST--
DCE must not remove FETCH_DIM_IS with a null key
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.optimization_level=-1
opcache.file_update_protection=0
--EXTENSIONS--
opcache
--FILE--
<?php
set_error_handler(function ($errno, $errstr) {
throw new Exception($errstr);
});

function test(null $k) {
$a = [];
$a[$k] ?? 0;
}

try {
test(null);
} catch (Exception $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
?>
--EXPECT--
Exception: Using null as an array offset is deprecated, use an empty string instead
Loading