parent
fb10132b6c
commit
c1d759de57
6 changed files with 198 additions and 6 deletions
@ -0,0 +1,38 @@ |
|||||||
|
--TEST-- |
||||||
|
Dynamic calls to scope introspection functions are forbidden |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
function test_calls($func) { |
||||||
|
$i = 1; |
||||||
|
|
||||||
|
try { |
||||||
|
array_map($func, [['i' => new stdClass]]); |
||||||
|
var_dump($i); |
||||||
|
} catch (\Error $e) { |
||||||
|
echo 'array_map: ' . $e->getMessage() . "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
call_user_func($func, ['i' => new stdClass]); |
||||||
|
var_dump($i); |
||||||
|
} catch (\Error $e) { |
||||||
|
echo 'call_user_func: ' . $e->getMessage() . "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
$func(['i' => new stdClass]); |
||||||
|
var_dump($i); |
||||||
|
} catch (\Error $e) { |
||||||
|
echo '$func: ' . $e->getMessage() . "\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function main() { |
||||||
|
test_calls('extract'); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECTF-- |
||||||
|
array_map: Cannot call extract() dynamically |
||||||
|
call_user_func: Cannot call extract() dynamically |
||||||
|
$func: Cannot call extract() dynamically |
||||||
@ -0,0 +1,59 @@ |
|||||||
|
--TEST-- |
||||||
|
Dynamic calls to scope introspection functions are forbidden (function variations) |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
function test() { |
||||||
|
|
||||||
|
try { |
||||||
|
$func = 'extract'; |
||||||
|
$func(['a' => 'b']); |
||||||
|
} catch (\Error $e) { |
||||||
|
echo $e->getMessage() . "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
$func = 'compact'; |
||||||
|
$func(['a']); |
||||||
|
} catch (\Error $e) { |
||||||
|
echo $e->getMessage() . "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
$func = 'get_defined_vars'; |
||||||
|
$func(); |
||||||
|
} catch (\Error $e) { |
||||||
|
echo $e->getMessage() . "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
$func = 'func_get_args'; |
||||||
|
$func(); |
||||||
|
} catch (\Error $e) { |
||||||
|
echo $e->getMessage() . "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
$func = 'func_get_arg'; |
||||||
|
$func(1); |
||||||
|
} catch (\Error $e) { |
||||||
|
echo $e->getMessage() . "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
try { |
||||||
|
$func = 'func_num_args'; |
||||||
|
$func(); |
||||||
|
} catch (\Error $e) { |
||||||
|
echo $e->getMessage() . "\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
function main() { |
||||||
|
test(); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
Cannot call extract() dynamically |
||||||
|
Cannot call compact() dynamically |
||||||
|
Cannot call get_defined_vars() dynamically |
||||||
|
Cannot call func_get_args() dynamically |
||||||
|
Cannot call func_get_arg() dynamically |
||||||
|
Cannot call func_num_args() dynamically |
||||||
@ -0,0 +1,23 @@ |
|||||||
|
--TEST-- |
||||||
|
Dynamic calls to scope introspection functions are forbidden (misoptimization) |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
function test() { |
||||||
|
$i = 1; |
||||||
|
try { |
||||||
|
array_map('extract', [['i' => new stdClass]]); |
||||||
|
} catch (\Error $e) { |
||||||
|
echo $e->getMessage() . "\n"; |
||||||
|
} |
||||||
|
$i += 1; |
||||||
|
var_dump($i); |
||||||
|
} |
||||||
|
|
||||||
|
function main() { |
||||||
|
test(); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
Cannot call extract() dynamically |
||||||
|
int(2) |
||||||
@ -0,0 +1,20 @@ |
|||||||
|
--TEST-- |
||||||
|
Don't optimize dynamic call to non-dynamic one if it drops the warning |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
function test() { |
||||||
|
try { |
||||||
|
((string) 'extract')(['a' => 42]); |
||||||
|
} catch (\Error $e) { |
||||||
|
echo $e->getMessage() . "\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function main() { |
||||||
|
test(); |
||||||
|
} |
||||||
|
|
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
Cannot call extract() dynamically |
||||||
@ -0,0 +1,32 @@ |
|||||||
|
--TEST-- |
||||||
|
Freeing of function "name" when dynamic call fails |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
try { |
||||||
|
$bar = "bar"; |
||||||
|
("foo" . $bar)(); |
||||||
|
} catch (Error $e) { |
||||||
|
echo $e->getMessage(), "\n"; |
||||||
|
} |
||||||
|
try { |
||||||
|
$bar = ["bar"]; |
||||||
|
(["foo"] + $bar)(); |
||||||
|
} catch (Error $e) { |
||||||
|
echo $e->getMessage(), "\n"; |
||||||
|
} |
||||||
|
try { |
||||||
|
(new stdClass)(); |
||||||
|
} catch (Error $e) { |
||||||
|
echo $e->getMessage(), "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
Invalid callback foobar, function "foobar" not found or invalid function name |
||||||
|
|
||||||
|
Warning: Array to string conversion in Unknown on line 0 |
||||||
|
|
||||||
|
Fatal error: Invalid callback Array, array callback must have exactly two members in Unknown on line 0 |
||||||
|
|
||||||
|
Fatal error: Invalid callback stdClass::__invoke, no array or string given in Unknown on line 0 |
||||||
Loading…
Reference in new issue