mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
More check_parameters improvements
* Allow / on everything but lLdb (on which it will work, but makes no sense). * For ! on lLdb add additional zend_bool* parameter. * For optional s and p only require one of the variables to be initialized. The length is usually not initialized.
This commit is contained in:
parent
06dde16a6a
commit
5c1b627458
1 changed files with 23 additions and 11 deletions
|
@ -45,13 +45,12 @@ $API_params = array(
|
||||||
//TODO 'L' => array('zend_long*, '), // long
|
//TODO 'L' => array('zend_long*, '), // long
|
||||||
'o' => array('zval**'), //object
|
'o' => array('zval**'), //object
|
||||||
'O' => array('zval**', 'zend_class_entry*'), // object of given type
|
'O' => array('zval**', 'zend_class_entry*'), // object of given type
|
||||||
'p' => array('char**', 'size_t*'), // valid path
|
|
||||||
'P' => array('zend_string**'), // valid path
|
'P' => array('zend_string**'), // valid path
|
||||||
'r' => array('zval**'), // resource
|
'r' => array('zval**'), // resource
|
||||||
's' => array('char**', 'size_t*'), // string
|
|
||||||
'S' => array('zend_string**'), // string
|
'S' => array('zend_string**'), // string
|
||||||
'z' => array('zval**'), // zval*
|
'z' => array('zval**'), // zval*
|
||||||
'Z' => array('zval***') // zval**
|
'Z' => array('zval***') // zval**
|
||||||
|
// 's', 'p' handled separately
|
||||||
);
|
);
|
||||||
|
|
||||||
/** reports an error, according to its level */
|
/** reports an error, according to its level */
|
||||||
|
@ -131,7 +130,7 @@ function get_vars($txt)
|
||||||
|
|
||||||
|
|
||||||
/** run diagnostic checks against one var. */
|
/** run diagnostic checks against one var. */
|
||||||
function check_param($db, $idx, $exp, $optional)
|
function check_param_allow_uninit($db, $idx, $exp, $optional)
|
||||||
{
|
{
|
||||||
global $error_few_vars_given;
|
global $error_few_vars_given;
|
||||||
|
|
||||||
|
@ -149,14 +148,18 @@ function check_param($db, $idx, $exp, $optional)
|
||||||
error("{$db[$idx][0]}: expected '$exp' but got '{$db[$idx][1]}' [".($idx+1).']');
|
error("{$db[$idx][0]}: expected '$exp' but got '{$db[$idx][1]}' [".($idx+1).']');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($optional && !$db[$idx][2]) {
|
if (!$optional && $db[$idx][2]) {
|
||||||
error("optional var not initialized: {$db[$idx][0]} [".($idx+1).']', 1);
|
|
||||||
|
|
||||||
} elseif (!$optional && $db[$idx][2]) {
|
|
||||||
error("not optional var is initialized: {$db[$idx][0]} [".($idx+1).']', 2);
|
error("not optional var is initialized: {$db[$idx][0]} [".($idx+1).']', 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function check_param($db, $idx, $exp, $optional)
|
||||||
|
{
|
||||||
|
check_param_allow_uninit($db, $idx, $exp, $optional);
|
||||||
|
if ($optional && !$db[$idx][2]) {
|
||||||
|
error("optional var not initialized: {$db[$idx][0]} [".($idx+1).']', 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** fetch params passed to zend_parse_params*() */
|
/** fetch params passed to zend_parse_params*() */
|
||||||
function get_params($vars, $str)
|
function get_params($vars, $str)
|
||||||
|
@ -227,15 +230,15 @@ function check_function($name, $txt, $offset)
|
||||||
|
|
||||||
// separate_zval_if_not_ref
|
// separate_zval_if_not_ref
|
||||||
case '/':
|
case '/':
|
||||||
if (!in_array($last_char, array('r', 'z'))) {
|
if (in_array($last_char, array('l', 'L', 'd', 'b'))) {
|
||||||
error("the '/' specifier cannot be applied to '$last_char'");
|
error("the '/' specifier should not be applied to '$last_char'");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// nullable arguments
|
// nullable arguments
|
||||||
case '!':
|
case '!':
|
||||||
if (!in_array($last_char, array('a', 'C', 'f', 'h', 'o', 'O', 'r', 's', 't', 'z', 'Z'))) {
|
if (in_array($last_char, array('l', 'L', 'd', 'b'))) {
|
||||||
error("the '!' specifier cannot be applied to '$last_char'");
|
check_param($params, ++$j, 'zend_bool*', $optional);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -251,6 +254,15 @@ function check_function($name, $txt, $offset)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 's':
|
||||||
|
case 'p':
|
||||||
|
check_param_allow_uninit($params, ++$j, 'char**', $optional);
|
||||||
|
check_param_allow_uninit($params, ++$j, 'size_t*', $optional);
|
||||||
|
if ($optional && !$params[$j-1][2] && !$params[$j][2]) {
|
||||||
|
error("one of optional vars {$params[$j-1][0]} or {$params[$j][0]} must be initialized", 1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (isset($API_params[$char])) {
|
if (isset($API_params[$char])) {
|
||||||
foreach($API_params[$char] as $exp) {
|
foreach($API_params[$char] as $exp) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue