mirror of
https://github.com/php/php-src.git
synced 2026-03-24 08:12:21 +01:00
Fixed bug #33996 (No information given for fatal error on passing invalid value to typed argument)
This commit is contained in:
2
NEWS
2
NEWS
@@ -2,6 +2,8 @@ PHP NEWS
|
||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||
?? ??? 2005, PHP 5.1
|
||||
- Fixed bug #33999 (object remains object when cast to int). (Dmitry)
|
||||
- Fixed bug #33996 (No information given for fatal error on passing invalid
|
||||
value to typed argument). (Dmitry)
|
||||
- Fixed bug #33989 (extract($GLOBALS,EXTR_REFS) crashes PHP). (Dmitry)
|
||||
- Fixed bug #33967 (misuse of Exception constructor doesn't display errorfile).
|
||||
(Jani)
|
||||
|
||||
@@ -12,4 +12,4 @@ foo(123);
|
||||
--EXPECTF--
|
||||
3
|
||||
|
||||
Fatal error: Argument 1 must be an array in %sarray_type_hint_001.php on line 2
|
||||
Fatal error: Argument 1 must be an array, called in %sarray_type_hint_001.php on line 7 and defined in %sarray_type_hint_001.php on line 2
|
||||
|
||||
29
Zend/tests/bug33996.phpt
Executable file
29
Zend/tests/bug33996.phpt
Executable file
@@ -0,0 +1,29 @@
|
||||
--TEST--
|
||||
Bug #33996 (No information given for fatal error on passing invalid value to typed argument)
|
||||
--INI--
|
||||
error_reporting=4095
|
||||
--FILE--
|
||||
<?php
|
||||
class Foo
|
||||
{
|
||||
// nothing
|
||||
}
|
||||
|
||||
function FooTest(Foo $foo)
|
||||
{
|
||||
echo "Hello!";
|
||||
}
|
||||
|
||||
function NormalTest($a)
|
||||
{
|
||||
echo "Hi!";
|
||||
}
|
||||
|
||||
NormalTest();
|
||||
FooTest();
|
||||
FooTest(new Foo());
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: Missing argument 1 for NormalTest(), called in %sbug33996.php on line 17 and defined in %sbug33996.php on line 12
|
||||
Hi!
|
||||
Fatal error: Argument 1 must be an object of class Foo, called in %sbug33996.php on line 18 and defined in %sbug33996.php on line 7
|
||||
@@ -447,6 +447,7 @@ static inline void make_real_object(zval **object_ptr TSRMLS_DC)
|
||||
static inline void zend_verify_arg_type(zend_function *zf, zend_uint arg_num, zval *arg TSRMLS_DC)
|
||||
{
|
||||
zend_arg_info *cur_arg_info;
|
||||
zend_execute_data *ptr = EG(current_execute_data)->prev_execute_data;
|
||||
|
||||
if (!zf->common.arg_info
|
||||
|| arg_num>zf->common.num_args) {
|
||||
@@ -457,12 +458,20 @@ static inline void zend_verify_arg_type(zend_function *zf, zend_uint arg_num, zv
|
||||
|
||||
if (cur_arg_info->class_name) {
|
||||
if (!arg) {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must be an object of class %s", arg_num, cur_arg_info->class_name);
|
||||
if(ptr && ptr->op_array) {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must be an object of class %s, called in %s on line %d and defined", arg_num, cur_arg_info->class_name, ptr->op_array->filename, ptr->opline->lineno);
|
||||
} else {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must be an object of class %s", arg_num, cur_arg_info->class_name);
|
||||
}
|
||||
}
|
||||
switch (Z_TYPE_P(arg)) {
|
||||
case IS_NULL:
|
||||
if (!cur_arg_info->allow_null) {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must not be null", arg_num);
|
||||
if(ptr && ptr->op_array) {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must not be null, called in %s on line %d and defined", arg_num, ptr->op_array->filename, ptr->opline->lineno);
|
||||
} else {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must not be null", arg_num);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case IS_OBJECT: {
|
||||
@@ -475,28 +484,48 @@ static inline void zend_verify_arg_type(zend_function *zf, zend_uint arg_num, zv
|
||||
} else {
|
||||
error_msg = "be an instance of";
|
||||
}
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must %s %s", arg_num, error_msg, ce->name);
|
||||
if(ptr && ptr->op_array) {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must %s %s, called in %s on line %d and defined", arg_num, error_msg, ce->name, ptr->op_array->filename, ptr->opline->lineno);
|
||||
} else {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must %s %s", arg_num, error_msg, ce->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must be an object of class %s", arg_num, cur_arg_info->class_name);
|
||||
if(ptr && ptr->op_array) {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must be an object of class %s, called in %s on line %d and defined", arg_num, cur_arg_info->class_name, ptr->op_array->filename, ptr->opline->lineno);
|
||||
} else {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must be an object of class %s", arg_num, cur_arg_info->class_name);
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else if (cur_arg_info->array_type_hint) {
|
||||
if (!arg) {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must be an array", arg_num);
|
||||
if(ptr && ptr->op_array) {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must be an array, called in %s on line %d and defined", arg_num, ptr->op_array->filename, ptr->opline->lineno);
|
||||
} else {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must be an array", arg_num);
|
||||
}
|
||||
}
|
||||
switch (Z_TYPE_P(arg)) {
|
||||
case IS_NULL:
|
||||
if (!cur_arg_info->allow_null) {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must not be null", arg_num);
|
||||
if(ptr && ptr->op_array) {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must not be null, called in %s on line %d and defined", arg_num, ptr->op_array->filename, ptr->opline->lineno);
|
||||
} else {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must not be null", arg_num);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case IS_ARRAY:
|
||||
break;
|
||||
default:
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must be an array", arg_num);
|
||||
if(ptr && ptr->op_array) {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must be an array, called in %s on line %d and defined", arg_num, ptr->op_array->filename, ptr->opline->lineno);
|
||||
} else {
|
||||
zend_error_noreturn(E_ERROR, "Argument %d must be an array", arg_num);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,4 +35,4 @@ $a->b($b);
|
||||
?>
|
||||
--EXPECTF--
|
||||
|
||||
Fatal error: Argument 1 must implement interface Foo in %s on line %d
|
||||
Fatal error: Argument 1 must implement interface Foo, called in %s on line 27 and defined in %s on line 12
|
||||
|
||||
@@ -23,4 +23,4 @@ type_hint_foo($bar);
|
||||
?>
|
||||
--EXPECTF--
|
||||
|
||||
Fatal error: Argument 1 must be an instance of Foo in %s on line %d
|
||||
Fatal error: Argument 1 must be an instance of Foo, called in %s on line 16 and defined in %s on line 9
|
||||
|
||||
Reference in New Issue
Block a user