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