📄 safeops.t
字号:
#!perl# Tests that all ops can be trapped by a Safe compartmentBEGIN { if ($ENV{PERL_CORE}) { chdir 't' if -d 't'; @INC = '../lib'; } else { # this won't work outside of the core, so exit print "1..0\n"; exit 0; }}use Config;BEGIN { if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') { print "1..0\n"; exit 0; }}use strict;use Test::More;use Safe;# Read the op names and descriptions directly from opcode.plmy @op;my %code;while (<DATA>) { chomp; die "Can't match $_" unless /^([a-z_0-9]+)\t+(.*)/; $code{$1} = $2;}open my $fh, '<', '../opcode.pl' or die "Can't open opcode.pl: $!";while (<$fh>) { last if /^__END__/;}while (<$fh>) { chomp; next if !$_ or /^#/; my ($op, $opname) = split /\t+/; push @op, [$op, $opname, $code{$op}];}close $fh;plan(tests => scalar @op);sub testop { my ($op, $opname, $code) = @_; pass("$op : skipped") and return if $code =~ /^SKIP/; pass("$op : skipped") and return if $code =~ m://: && $] < 5.009; # no dor my $c = new Safe; $c->deny_only($op); $c->reval($code); like($@, qr/'\Q$opname\E' trapped by operation mask/, $op);}foreach (@op) { if ($_->[2]) { testop @$_; } else { local $TODO = "No test yet for $_->[1]"; fail(); }}# things that begin with SKIP are skipped, for various reasons (notably# optree modified by the optimizer -- Safe checks are done before the# optimizer modifies the optree)__DATA__null SKIPstub SKIPscalar scalar $xpushmark print @xwantarray wantarrayconst 42gvsv SKIP (set by optimizer) $xgv SKIP *xgelem *x{SCALAR}padsv SKIP my $xpadav SKIP my @xpadhv SKIP my %xpadany SKIP (not implemented)pushre SKIP split /foo/rv2gv *xrv2sv $xav2arylen $#xrv2cv f()anoncode sub { }prototype prototype 'foo'refgen \($x,$y)srefgen SKIP \$xref refbless blessbacktick qx/ls/glob <*.c>readline <FH>rcatline SKIP (set by optimizer) $x .= <F>regcmaybe SKIP (internal)regcreset SKIP (internal)regcomp SKIP (internal)match /foo/qr qr/foo/subst s/foo/bar/substcont SKIP (set by optimizer)trans y:z:t:sassign $x = $yaassign @x = @ychop chop @fooschop chopchomp chomp @fooschomp chompdefined definedundef undefstudy studypos pospreinc ++$ii_preinc SKIP (set by optimizer)predec --$ii_predec SKIP (set by optimizer)postinc $i++i_postinc SKIP (set by optimizer)postdec $i--i_postdec SKIP (set by optimizer)pow $x ** $ymultiply $x * $yi_multiply SKIP (set by optimizer)divide $x / $yi_divide SKIP (set by optimizer)modulo $x % $yi_modulo SKIP (set by optimizer)repeat $x x $yadd $x + $yi_add SKIP (set by optimizer)subtract $x - $yi_subtract SKIP (set by optimizer)concat $x . $ystringify "$x"left_shift $x << 1right_shift $x >> 1lt $x < $yi_lt SKIP (set by optimizer)gt $x > $yi_gt SKIP (set by optimizer)le $i <= $yi_le SKIP (set by optimizer)ge $i >= $yi_ge SKIP (set by optimizer)eq $x == $yi_eq SKIP (set by optimizer)ne $x != $yi_ne SKIP (set by optimizer)ncmp $i <=> $yi_ncmp SKIP (set by optimizer)slt $x lt $ysgt $x gt $ysle $x le $ysge $x ge $yseq $x eq $ysne $x ne $yscmp $x cmp $ybit_and $x & $ybit_xor $x ^ $ybit_or $x | $ynegate -$xi_negate SKIP (set by optimizer)not !$xcomplement ~$xatan2 atan2 1sin sin 1cos cos 1rand randsrand srandexp exp 1log log 1sqrt sqrt 1int inthex hexoct octabs abslength lengthsubstr substr $x, 1vec vecindex indexrindex rindexsprintf sprintf '%s', 'foo'formline formlineord ordchr chrcrypt crypt 'foo','bar'ucfirst ucfirstlcfirst lcfirstuc uclc lcquotemeta quotemetarv2av @aaelemfast SKIP (set by optimizer)aelem $a[1]aslice @a[1,2]each each %hvalues values %hkeys keys %hdelete delete $h{Key}exists exists $h{Key}rv2hv %hhelem $h{kEy}hslice @h{kEy}unpack unpackpack packsplit split /foo/join join $a, @blist @x = (1,2)lslice SKIP @x[1,2]anonlist [1,2]anonhash { a => 1 }splice splice @x, 1, 2, 3push push @x, $xpop pop @xshift shift @xunshift unshift @xsort sort @xreverse reverse @xgrepstart grep { $_ eq 'foo' } @xgrepwhile SKIP grep { $_ eq 'foo' } @xmapstart map $_ + 1, @foomapwhile SKIP (set by optimizer)range SKIPflip 1..2flop 1..2and $x && $yor $x || $yxor $x xor $ycond_expr $x ? 1 : 0andassign $x &&= $yorassign $x ||= $ymethod Foo->$x()entersub f()leavesub sub f{} f()leavesublv sub f:lvalue{return $x} f()caller callerwarn warndie diereset resetlineseq SKIPnextstate SKIPdbstate SKIP (needs debugger)unstack while(0){}enter SKIPleave SKIPscope SKIPenteriter SKIPiter SKIPenterloop SKIPleaveloop SKIPreturn returnlast lastnext nextredo redo THISdump dumpgoto goto THEREexit exit 0open open FOOclose close FOOpipe_op pipe FOO,BARfileno fileno FOOumask umask 0755, 'foo'binmode binmode FOOtie tieuntie untietied tieddbmopen dbmopendbmclose dbmclosesselect SKIP (set by optimizer)select select FOOgetc getc FOOread read FOOenterwrite writeleavewrite SKIPprtf printfprint printsysopen sysopensysseek sysseeksysread sysreadsyswrite syswritesend sendrecv recveof eof FOOtell tellseek seek FH, $pos, $whencetruncate truncate FOO, 42fcntl fcntlioctl ioctlflock flock FOO, 1socket socketsockpair socketpairbind bindconnect connectlisten listenaccept acceptshutdown shutdowngsockopt getsockoptssockopt setsockoptgetsockname getsocknamegetpeername getpeernamelstat lstat FOOstat stat FOOftrread -Rftrwrite -Wftrexec -Xfteread -rftewrite -wfteexec -xftis -efteowned SKIP -Oftrowned SKIP -oftzero -zftsize -sftmtime -Mftatime -Aftctime -Cftsock -Sftchr -cftblk -bftfile -fftdir -dftpipe -pftlink -lftsuid -uftsgid -gftsvtx -kfttty -tfttext -Tftbinary -Bchdir chdir '/'chown chownchroot chrootunlink unlink 'foo'chmod chmod 511, 'foo'utime utimerename rename 'foo', 'bar'link link 'foo', 'bar'symlink symlink 'foo', 'bar'readlink readlink 'foo'mkdir mkdir 'foo'rmdir rmdir 'foo'open_dir opendir DIRreaddir readdir DIRtelldir telldir DIRseekdir seekdir DIR, $posrewinddir rewinddir DIRclosedir closedir DIRfork forkwait waitwaitpid waitpidsystem systemexec execkill killgetppid getppidgetpgrp getpgrpsetpgrp setpgrpgetpriority getprioritysetpriority setprioritytime timetms timeslocaltime localtimegmtime gmtimealarm alarmsleep sleep 1shmget shmgetshmctl shmctlshmread shmreadshmwrite shmwritemsgget msggetmsgctl msgctlmsgsnd msgsndmsgrcv msgrcvsemget semgetsemctl semctlsemop semoprequire use strictdofile do 'file'entereval eval "1+1"leaveeval eval "1+1"entertry SKIP eval { 1+1 }leavetry SKIP eval { 1+1 }ghbyname gethostbyname 'foo'ghbyaddr gethostbyaddr 'foo'ghostent gethostentgnbyname getnetbyname 'foo'gnbyaddr getnetbyaddr 'foo'gnetent getnetentgpbyname getprotobyname 'foo'gpbynumber getprotobynumber 42gprotoent getprotoentgsbyname getservbyname 'name', 'proto'gsbyport getservbyport 'a', 'b'gservent getserventshostent sethostentsnetent setnetentsprotoent setprotoentsservent setserventehostent endhostentenetent endnetenteprotoent endprotoenteservent endserventgpwnam getpwnamgpwuid getpwuidgpwent getpwentspwent setpwentepwent endpwentggrnam getgrnamggrgid getgrgidggrent getgrentsgrent setgrentegrent endgrentgetlogin getloginsyscall syscalllock SKIPthreadsv SKIPsetstate SKIPmethod_named $x->y()dor $x // $ydorassign $x //= $ycustom SKIP (no way)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -