Promote write "use scalar as array" warning to Error

This commit is contained in:
Nikita Popov 2019-09-27 14:47:23 +02:00
parent 32c20d5670
commit e8b0163e0b
8 changed files with 91 additions and 79 deletions

View file

@ -86,18 +86,16 @@ PHP 8.0 UPGRADE NOTES
function test(?int $arg = CONST_RESOLVING_TO_NULL) {}
// Or
function test(int $arg = null) {}
. Attempting to write to a property of a non-object will now result in an
Error exception. Previously this resulted in a warning and either converted
the value into an object (if it was null, false or an empty string) or
ignored the write altogether (in all other cases).
RFC: Part of https://wiki.php.net/rfc/engine_warnings
. Attempting to append an element to an array for which the PHP_INT_MAX key
is already used will now result in an Error exception. Previously this was
a warning.
RFC: Part of https://wiki.php.net/rfc/engine_warnings
. Attempting to use an invalid type (array or object) as an array key or
string offset will now result in a TypeError exception. Previously this was
a warning.
. A number of warnings have been converted into Error exceptions:
* Attempting to write to a property of a non-object. Previously this
implicitly created an stdClass object for null, false and empty strings.
* Attempting to append an element to an array for which the PHP_INT_MAX key
is already used.
* Attempting to use an invalid type (array or object) as an array key or
string offset.
* Attempting to write to an index of a scalar value.
RFC: Part of https://wiki.php.net/rfc/engine_warnings
- COM:

View file

@ -24,7 +24,12 @@ function test() {
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
var_dump($true[123] = 456);
try {
var_dump($true[123] = 456);
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
try {
var_dump($array[] += 123);
@ -43,7 +48,12 @@ function test() {
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
var_dump($true[123] += 456);
try {
var_dump($true[123] += 456);
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
try {
var_dump($true->foo = 123);
@ -60,18 +70,14 @@ function test() {
test();
?>
--EXPECTF--
--EXPECT--
Cannot add element to the array as the next element is already occupied
Illegal offset type
Illegal offset type
Warning: Cannot use a scalar value as an array in %s on line %d
NULL
Cannot use a scalar value as an array
Cannot add element to the array as the next element is already occupied
Illegal offset type
Illegal offset type
Warning: Cannot use a scalar value as an array in %s on line %d
NULL
Cannot use a scalar value as an array
Attempt to assign property 'foo' of non-object
Attempt to assign property 'foo' of non-object

View file

@ -7,32 +7,48 @@ $array=array(1);
$testvalues=array(null, 0, 1, true, false,'',' ',0.1,array());
foreach ($testvalues as $testvalue) {
$testvalue['foo']=$array;
var_dump ($testvalue);
try {
$testvalue['foo']=$array;
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
var_dump($testvalue);
}
echo "\n*** Indexing - Testing reference assignment with key ***\n";
$testvalues=array(null, 0, 1, true, false,0.1,array());
foreach ($testvalues as $testvalue) {
$testvalue['foo']=&$array;
var_dump ($testvalue);
try {
$testvalue['foo']=&$array;
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
var_dump($testvalue);
}
echo "*** Indexing - Testing value assignment no key ***\n";
$array=array(1);
$testvalues=array(null, 0, 1, true, false,0.1,array());
foreach ($testvalues as $testvalue) {
$testvalue[]=$array;
var_dump ($testvalue);
try {
$testvalue[]=$array;
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
var_dump ($testvalue);
}
echo "\n*** Indexing - Testing reference assignment no key ***\n";
$testvalues=array(null, 0, 1, true, false,0.1,array());
foreach ($testvalues as $testvalue) {
$testvalue[]=&$array;
var_dump ($testvalue);
try {
$testvalue[]=&$array;
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
var_dump ($testvalue);
}
@ -47,14 +63,11 @@ array(1) {
int(1)
}
}
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
int(0)
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
int(1)
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
bool(true)
array(1) {
["foo"]=>
@ -73,8 +86,7 @@ Warning: Illegal string offset 'foo' in %s on line %d
Notice: Array to string conversion in %s on line %d
string(1) "A"
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
float(0.1)
array(1) {
["foo"]=>
@ -92,14 +104,11 @@ array(1) {
int(1)
}
}
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
int(0)
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
int(1)
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
bool(true)
array(1) {
["foo"]=>
@ -108,8 +117,7 @@ array(1) {
int(1)
}
}
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
float(0.1)
array(1) {
["foo"]=>
@ -126,14 +134,11 @@ array(1) {
int(1)
}
}
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
int(0)
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
int(1)
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
bool(true)
array(1) {
[0]=>
@ -142,8 +147,7 @@ array(1) {
int(1)
}
}
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
float(0.1)
array(1) {
[0]=>
@ -161,14 +165,11 @@ array(1) {
int(1)
}
}
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
int(0)
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
int(1)
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
bool(true)
array(1) {
[0]=>
@ -177,8 +178,7 @@ array(1) {
int(1)
}
}
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
float(0.1)
array(1) {
[0]=>

View file

@ -1887,7 +1887,7 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_param_must_be_ref(con
static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_use_scalar_as_array(void)
{
zend_error(E_WARNING, "Cannot use a scalar value as an array");
zend_throw_error(NULL, "Cannot use a scalar value as an array");
}
static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_cannot_add_element(void)
@ -2172,7 +2172,7 @@ return_null:
ZVAL_ERROR(result);
} else {
if (type == BP_VAR_UNSET) {
zend_error(E_WARNING, "Cannot unset offset in a non-array variable");
zend_throw_error(NULL, "Cannot unset offset in a non-array variable");
ZVAL_NULL(result);
} else {
zend_use_scalar_as_array();

View file

@ -931,10 +931,10 @@ static void ZEND_FASTCALL zend_jit_assign_dim_helper(zval *object_ptr, zval *dim
}
} else {
//??? if (OP1_TYPE != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) {
zend_error(E_WARNING, "Cannot use a scalar value as an array");
zend_throw_error(NULL, "Cannot use a scalar value as an array");
//??? }
if (result) {
ZVAL_NULL(result);
ZVAL_UNDEF(result);
}
}
}
@ -978,7 +978,7 @@ static void ZEND_FASTCALL zend_jit_assign_dim_op_helper(zval *container, zval *d
//??? ZEND_VM_C_GOTO(assign_dim_op_convert_to_array);
} else {
//??? if (UNEXPECTED(OP1_TYPE != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
zend_error(E_WARNING, "Cannot use a scalar value as an array");
zend_throw_error(NULL, "Cannot use a scalar value as an array");
//??? }
//??? if (retval) {
//??? ZVAL_NULL(retval);

View file

@ -71,9 +71,13 @@ function foo4() {
foo4();
function foo5() {
$a = 1;
$a[2] = 1;
return $a;
$a = 1;
try {
$a[2] = 1;
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
return $a;
}
var_dump(foo5());
@ -129,6 +133,5 @@ array(1) {
int(1)
}
}
Warning: Cannot use a scalar value as an array in %sassign_dim_002.php on line 65
Cannot use a scalar value as an array
int(1)

View file

@ -3,9 +3,11 @@ Bug #29893 (segfault when using array as index)
--FILE--
<?php
$base = 50;
$base[$base] -= 0;
try {
$base[$base] -= 0;
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
?>
===DONE===
--EXPECTF--
Warning: Cannot use a scalar value as an array in %sbug29893.php on line %d
===DONE===
--EXPECT--
Cannot use a scalar value as an array

View file

@ -10,7 +10,11 @@ echo "A=$a B=$b\n";
// Warning: Cannot use a scalar value as an array in %s on line %d
$c[$c=1] = 1;
try {
$c[$c=1] = 1;
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
// i++ evaluated first, so $d[0] is 10
$d = array(0,10);
@ -90,8 +94,7 @@ print_r($ee);
?>
--EXPECTF--
A=hello B=bye
Warning: Cannot use a scalar value as an array in %s on line %d
Cannot use a scalar value as an array
array(2) {
[0]=>
int(10)