test(zend): 添加heredoc语法和半保留字测试用例

- 添加GH-16630 UAF漏洞相关编码转换和heredoc测试
- 添加基本heredoc语法测试用例
- 添加二进制heredoc语法测试用例
- 添加变量替换相关heredoc测试用例
- 添加复杂变量替换相关heredoc测试用例
- 添加半保留字作为静态类方法的测试用例
- 添加公共测试辅助文件nowdoc.inc
- 添加示例代码文件lv3_prop.php和prop.php
pull/1/head
韩天峰 7 months ago
parent 166f53f28e
commit 3959fee828
  1. 11
      examples/lv3_prop.php
  2. 8
      examples/prop.php
  3. 245
      tests/zend/grammar/semi_reserved_002.phpt
  4. 19
      tests/zend/heredoc_nowdoc/gh16630.phpt
  5. 23
      tests/zend/heredoc_nowdoc/heredoc_001.phpt
  6. 23
      tests/zend/heredoc_nowdoc/heredoc_002.phpt
  7. 24
      tests/zend/heredoc_nowdoc/heredoc_003.phpt
  8. 24
      tests/zend/heredoc_nowdoc/heredoc_004.phpt
  9. 28
      tests/zend/heredoc_nowdoc/heredoc_005.phpt
  10. 10
      tests/zend/heredoc_nowdoc/nowdoc.inc

@ -0,0 +1,11 @@
<?php
function main()
{
$o = new stdClass();
$o->prop = ['dim2' => ['dim3' => 'value']];
$o->prop['dim2']['dim3'] = 'hello';
var_dump($o);
}

@ -0,0 +1,8 @@
<?php
function main()
{
$o = new stdClass;
$o->a = 1024;
$o->a *= 2;
var_dump($o->a);
}

@ -0,0 +1,245 @@
--TEST--
Test semi-reserved words as static class methods
--FILE--
<?php
class Obj
{
static function empty(){ echo __METHOD__, PHP_EOL; }
static function callable(){ echo __METHOD__, PHP_EOL; }
static function class(){ echo __METHOD__, PHP_EOL; }
static function trait(){ echo __METHOD__, PHP_EOL; }
static function extends(){ echo __METHOD__, PHP_EOL; }
static function implements(){ echo __METHOD__, PHP_EOL; }
static function static(){ echo __METHOD__, PHP_EOL; }
static function abstract(){ echo __METHOD__, PHP_EOL; }
static function final(){ echo __METHOD__, PHP_EOL; }
static function public(){ echo __METHOD__, PHP_EOL; }
static function protected(){ echo __METHOD__, PHP_EOL; }
static function private(){ echo __METHOD__, PHP_EOL; }
static function const(){ echo __METHOD__, PHP_EOL; }
static function enddeclare(){ echo __METHOD__, PHP_EOL; }
static function endfor(){ echo __METHOD__, PHP_EOL; }
static function endforeach(){ echo __METHOD__, PHP_EOL; }
static function endif(){ echo __METHOD__, PHP_EOL; }
static function endwhile(){ echo __METHOD__, PHP_EOL; }
static function and(){ echo __METHOD__, PHP_EOL; }
static function global(){ echo __METHOD__, PHP_EOL; }
static function goto(){ echo __METHOD__, PHP_EOL; }
static function instanceof(){ echo __METHOD__, PHP_EOL; }
static function insteadof(){ echo __METHOD__, PHP_EOL; }
static function interface(){ echo __METHOD__, PHP_EOL; }
static function namespace(){ echo __METHOD__, PHP_EOL; }
static function new(){ echo __METHOD__, PHP_EOL; }
static function or(){ echo __METHOD__, PHP_EOL; }
static function xor(){ echo __METHOD__, PHP_EOL; }
static function try(){ echo __METHOD__, PHP_EOL; }
static function use(){ echo __METHOD__, PHP_EOL; }
static function var(){ echo __METHOD__, PHP_EOL; }
static function exit(){ echo __METHOD__, PHP_EOL; }
static function list(){ echo __METHOD__, PHP_EOL; }
static function clone(){ echo __METHOD__, PHP_EOL; }
static function include(){ echo __METHOD__, PHP_EOL; }
static function include_once(){ echo __METHOD__, PHP_EOL; }
static function throw(){ echo __METHOD__, PHP_EOL; }
static function array(){ echo __METHOD__, PHP_EOL; }
static function print(){ echo __METHOD__, PHP_EOL; }
static function echo(){ echo __METHOD__, PHP_EOL; }
static function require(){ echo __METHOD__, PHP_EOL; }
static function require_once(){ echo __METHOD__, PHP_EOL; }
static function return(){ echo __METHOD__, PHP_EOL; }
static function else(){ echo __METHOD__, PHP_EOL; }
static function elseif(){ echo __METHOD__, PHP_EOL; }
static function default(){ echo __METHOD__, PHP_EOL; }
static function break(){ echo __METHOD__, PHP_EOL; }
static function continue(){ echo __METHOD__, PHP_EOL; }
static function switch(){ echo __METHOD__, PHP_EOL; }
static function yield(){ echo __METHOD__, PHP_EOL; }
static function function(){ echo __METHOD__, PHP_EOL; }
static function fn(){ echo __METHOD__, PHP_EOL; }
static function if(){ echo __METHOD__, PHP_EOL; }
static function endswitch(){ echo __METHOD__, PHP_EOL; }
static function finally(){ echo __METHOD__, PHP_EOL; }
static function for(){ echo __METHOD__, PHP_EOL; }
static function foreach(){ echo __METHOD__, PHP_EOL; }
static function declare(){ echo __METHOD__, PHP_EOL; }
static function case(){ echo __METHOD__, PHP_EOL; }
static function do(){ echo __METHOD__, PHP_EOL; }
static function while(){ echo __METHOD__, PHP_EOL; }
static function as(){ echo __METHOD__, PHP_EOL; }
static function catch(){ echo __METHOD__, PHP_EOL; }
static function die(){ echo __METHOD__, PHP_EOL; }
static function self(){ echo __METHOD__, PHP_EOL; }
static function parent(){ echo __METHOD__, PHP_EOL; }
static function isset(){ echo __METHOD__, PHP_EOL; }
static function unset(){ echo __METHOD__, PHP_EOL; }
static function __CLASS__(){ echo __METHOD__, PHP_EOL; }
static function __TRAIT__(){ echo __METHOD__, PHP_EOL; }
static function __FUNCTION__(){ echo __METHOD__, PHP_EOL; }
static function __METHOD__(){ echo __METHOD__, PHP_EOL; }
static function __LINE__(){ echo __METHOD__, PHP_EOL; }
static function __FILE__(){ echo __METHOD__, PHP_EOL; }
static function __DIR__(){ echo __METHOD__, PHP_EOL; }
static function __NAMESPACE__(){ echo __METHOD__, PHP_EOL; }
}
function main() {
Obj::empty();
Obj::callable();
Obj::class();
Obj::trait();
Obj::extends();
Obj::implements();
Obj::static();
Obj::abstract();
Obj::final();
Obj::public();
Obj::protected();
Obj::private();
Obj::const();
Obj::enddeclare();
Obj::endfor();
Obj::endforeach();
Obj::endif();
Obj::endwhile();
Obj::and();
Obj::global();
Obj::goto();
Obj::instanceof();
Obj::insteadof();
Obj::interface();
Obj::namespace();
Obj::new();
Obj::or();
Obj::xor();
Obj::try();
Obj::use();
Obj::var();
Obj::exit();
Obj::list();
Obj::clone();
Obj::include();
Obj::include_once();
Obj::throw();
Obj::array();
Obj::print();
Obj::echo();
Obj::require();
Obj::require_once();
Obj::return();
Obj::else();
Obj::elseif();
Obj::default();
Obj::break();
Obj::continue();
Obj::switch();
Obj::yield();
Obj::function();
Obj::fn();
Obj::if();
Obj::endswitch();
Obj::finally();
Obj::for();
Obj::foreach();
Obj::declare();
Obj::case();
Obj::do();
Obj::while();
Obj::as();
Obj::catch();
Obj::die();
Obj::self();
Obj::parent();
Obj::isset();
Obj::unset();
Obj::__CLASS__();
Obj::__TRAIT__();
Obj::__FUNCTION__();
Obj::__METHOD__();
Obj::__LINE__();
Obj::__FILE__();
Obj::__DIR__();
Obj::__NAMESPACE__();
echo "\nDone\n";
}
?>
--EXPECT--
Obj::empty
Obj::callable
Obj::class
Obj::trait
Obj::extends
Obj::implements
Obj::static
Obj::abstract
Obj::final
Obj::public
Obj::protected
Obj::private
Obj::const
Obj::enddeclare
Obj::endfor
Obj::endforeach
Obj::endif
Obj::endwhile
Obj::and
Obj::global
Obj::goto
Obj::instanceof
Obj::insteadof
Obj::interface
Obj::namespace
Obj::new
Obj::or
Obj::xor
Obj::try
Obj::use
Obj::var
Obj::exit
Obj::list
Obj::clone
Obj::include
Obj::include_once
Obj::throw
Obj::array
Obj::print
Obj::echo
Obj::require
Obj::require_once
Obj::return
Obj::else
Obj::elseif
Obj::default
Obj::break
Obj::continue
Obj::switch
Obj::yield
Obj::function
Obj::fn
Obj::if
Obj::endswitch
Obj::finally
Obj::for
Obj::foreach
Obj::declare
Obj::case
Obj::do
Obj::while
Obj::as
Obj::catch
Obj::die
Obj::self
Obj::parent
Obj::isset
Obj::unset
Obj::__CLASS__
Obj::__TRAIT__
Obj::__FUNCTION__
Obj::__METHOD__
Obj::__LINE__
Obj::__FILE__
Obj::__DIR__
Obj::__NAMESPACE__
Done

@ -0,0 +1,19 @@
--TEST--
GH-16630 (UAF in lexer with encoding translation and heredocs)
--EXTENSIONS--
mbstring
--INI--
zend.multibyte=On
zend.script_encoding=ISO-8859-1
internal_encoding=EUC-JP
--FILE--
<?php
$data3 = <<<CODE
heredoc
text
CODE;
echo $data3;
?>
--EXPECT--
heredoc
text

@ -0,0 +1,23 @@
--TEST--
basic heredoc syntax
--FILE--
<?php
require_once __DIR__ . '/nowdoc.inc';
print <<<ENDOFHEREDOC
This is a heredoc test.
ENDOFHEREDOC;
$x = <<<ENDOFHEREDOC
This is another heredoc test.
ENDOFHEREDOC;
print "{$x}";
?>
--EXPECT--
This is a heredoc test.
This is another heredoc test.

@ -0,0 +1,23 @@
--TEST--
basic binary heredoc syntax
--FILE--
<?php
require_once __DIR__ . '/nowdoc.inc';
print b<<<ENDOFHEREDOC
This is a heredoc test.
ENDOFHEREDOC;
$x = b<<<ENDOFHEREDOC
This is another heredoc test.
ENDOFHEREDOC;
print "{$x}";
?>
--EXPECT--
This is a heredoc test.
This is another heredoc test.

@ -0,0 +1,24 @@
--TEST--
simple variable replacement test (heredoc)
--FILE--
<?php
$a = 1;
$b = 2;
print <<<ENDOFHEREDOC
This is heredoc test #$a.
ENDOFHEREDOC;
$x = <<<ENDOFHEREDOC
This is heredoc test #$b.
ENDOFHEREDOC;
print "{$x}";
?>
--EXPECT--
This is heredoc test #1.
This is heredoc test #2.

@ -0,0 +1,24 @@
--TEST--
braces variable replacement test (heredoc)
--FILE--
<?php
$a = 1;
$b = 2;
print <<<ENDOFHEREDOC
This is heredoc test #{$a}.
ENDOFHEREDOC;
$x = <<<ENDOFHEREDOC
This is heredoc test #{$b}.
ENDOFHEREDOC;
print "{$x}";
?>
--EXPECT--
This is heredoc test #1.
This is heredoc test #2.

@ -0,0 +1,28 @@
--TEST--
unbraced complex variable replacement test (heredoc)
--FILE--
<?php
function main() {
require_once __DIR__ . '/nowdoc.inc';
$a = 1;
$b = 2;
$c = array( 'c' => 3, );
$d = new d;
print <<<ENDOFHEREDOC
This is heredoc test #s $a, $b, {$c['c']}, and $d->d.
ENDOFHEREDOC;
$x = <<<ENDOFHEREDOC
This is heredoc test #s $a, $b, {$c['c']}, and $d->d.
ENDOFHEREDOC;
print "{$x}";
}
?>
--EXPECTF--
This is heredoc test #s 1, 2, 3, and 4.
This is heredoc test #s 1, 2, 3, and 4.

@ -0,0 +1,10 @@
<?php
// Common definitions for heredoc/nowdoc tests.
$a = 1;
$b = 2;
$c = array( 'c' => 3, );
class d { public $d = 4; };
$d = new d;
?>
Loading…
Cancel
Save