Eviscerate README.macos to match the state of the world
[p5sagit/p5-mst-13.2.git] / dist / Safe / t / safeops.t
CommitLineData
6c52f3eb 1#!perl
2# Tests that all ops can be trapped by a Safe compartment
3
4BEGIN {
c81476ca 5 unless ($ENV{PERL_CORE}) {
6c52f3eb 6 # this won't work outside of the core, so exit
54f12473 7 print "1..0 # skipped: PERL_CORE unset\n"; exit 0;
6c52f3eb 8 }
9}
10use Config;
11BEGIN {
12 if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') {
13 print "1..0\n"; exit 0;
14 }
15}
16
17use strict;
78396813 18use Test::More;
6c52f3eb 19use Safe;
20
21# Read the op names and descriptions directly from opcode.pl
22my @op;
78396813 23my %code;
24
25while (<DATA>) {
26 chomp;
27 die "Can't match $_" unless /^([a-z_0-9]+)\t+(.*)/;
28 $code{$1} = $2;
29}
30
c81476ca 31open my $fh, '<', '../../opcode.pl' or die "Can't open opcode.pl: $!";
6c52f3eb 32while (<$fh>) {
33 last if /^__END__/;
34}
35while (<$fh>) {
36 chomp;
37 next if !$_ or /^#/;
38 my ($op, $opname) = split /\t+/;
78396813 39 push @op, [$op, $opname, $code{$op}];
6c52f3eb 40}
41close $fh;
42
78396813 43plan(tests => scalar @op);
44
6c52f3eb 45sub testop {
46 my ($op, $opname, $code) = @_;
47 pass("$op : skipped") and return if $code =~ /^SKIP/;
4bc6199f 48 pass("$op : skipped") and return if $code =~ m://|~~: && $] < 5.010;
6c52f3eb 49 my $c = new Safe;
50 $c->deny_only($op);
51 $c->reval($code);
52 like($@, qr/'\Q$opname\E' trapped by operation mask/, $op);
53}
54
78396813 55foreach (@op) {
56 if ($_->[2]) {
57 testop @$_;
58 } else {
59 local $TODO = "No test yet for $_->[1]";
60 fail();
61 }
6c52f3eb 62}
63
6c52f3eb 64# things that begin with SKIP are skipped, for various reasons (notably
65# optree modified by the optimizer -- Safe checks are done before the
66# optimizer modifies the optree)
67
68__DATA__
78396813 69null SKIP
70stub SKIP
71scalar scalar $x
72pushmark print @x
73wantarray wantarray
74const 42
75gvsv SKIP (set by optimizer) $x
76gv SKIP *x
77gelem *x{SCALAR}
78padsv SKIP my $x
79padav SKIP my @x
80padhv SKIP my %x
81padany SKIP (not implemented)
82pushre SKIP split /foo/
83rv2gv *x
84rv2sv $x
85av2arylen $#x
86rv2cv f()
87anoncode sub { }
88prototype prototype 'foo'
89refgen \($x,$y)
90srefgen SKIP \$x
91ref ref
92bless bless
93backtick qx/ls/
94glob <*.c>
95readline <FH>
96rcatline SKIP (set by optimizer) $x .= <F>
97regcmaybe SKIP (internal)
98regcreset SKIP (internal)
99regcomp SKIP (internal)
100match /foo/
101qr qr/foo/
102subst s/foo/bar/
103substcont SKIP (set by optimizer)
104trans y:z:t:
105sassign $x = $y
106aassign @x = @y
107chop chop @foo
108schop chop
109chomp chomp @foo
110schomp chomp
111defined defined
112undef undef
113study study
114pos pos
115preinc ++$i
116i_preinc SKIP (set by optimizer)
117predec --$i
118i_predec SKIP (set by optimizer)
119postinc $i++
120i_postinc SKIP (set by optimizer)
121postdec $i--
122i_postdec SKIP (set by optimizer)
123pow $x ** $y
124multiply $x * $y
125i_multiply SKIP (set by optimizer)
126divide $x / $y
127i_divide SKIP (set by optimizer)
128modulo $x % $y
129i_modulo SKIP (set by optimizer)
130repeat $x x $y
131add $x + $y
132i_add SKIP (set by optimizer)
133subtract $x - $y
134i_subtract SKIP (set by optimizer)
135concat $x . $y
136stringify "$x"
137left_shift $x << 1
138right_shift $x >> 1
139lt $x < $y
140i_lt SKIP (set by optimizer)
141gt $x > $y
142i_gt SKIP (set by optimizer)
143le $i <= $y
144i_le SKIP (set by optimizer)
145ge $i >= $y
146i_ge SKIP (set by optimizer)
147eq $x == $y
148i_eq SKIP (set by optimizer)
149ne $x != $y
150i_ne SKIP (set by optimizer)
151ncmp $i <=> $y
152i_ncmp SKIP (set by optimizer)
153slt $x lt $y
154sgt $x gt $y
155sle $x le $y
156sge $x ge $y
157seq $x eq $y
158sne $x ne $y
159scmp $x cmp $y
160bit_and $x & $y
161bit_xor $x ^ $y
162bit_or $x | $y
163negate -$x
164i_negate SKIP (set by optimizer)
165not !$x
166complement ~$x
167atan2 atan2 1
168sin sin 1
169cos cos 1
170rand rand
171srand srand
172exp exp 1
173log log 1
174sqrt sqrt 1
175int int
176hex hex
177oct oct
178abs abs
179length length
180substr substr $x, 1
181vec vec
182index index
183rindex rindex
184sprintf sprintf '%s', 'foo'
185formline formline
186ord ord
187chr chr
188crypt crypt 'foo','bar'
189ucfirst ucfirst
190lcfirst lcfirst
191uc uc
192lc lc
193quotemeta quotemeta
194rv2av @a
195aelemfast SKIP (set by optimizer)
196aelem $a[1]
197aslice @a[1,2]
198each each %h
199values values %h
200keys keys %h
201delete delete $h{Key}
202exists exists $h{Key}
203rv2hv %h
204helem $h{kEy}
205hslice @h{kEy}
206unpack unpack
207pack pack
208split split /foo/
209join join $a, @b
210list @x = (1,2)
211lslice SKIP @x[1,2]
212anonlist [1,2]
213anonhash { a => 1 }
214splice splice @x, 1, 2, 3
215push push @x, $x
216pop pop @x
217shift shift @x
218unshift unshift @x
219sort sort @x
220reverse reverse @x
221grepstart grep { $_ eq 'foo' } @x
222grepwhile SKIP grep { $_ eq 'foo' } @x
223mapstart map $_ + 1, @foo
224mapwhile SKIP (set by optimizer)
225range SKIP
226flip 1..2
227flop 1..2
228and $x && $y
229or $x || $y
230xor $x xor $y
231cond_expr $x ? 1 : 0
232andassign $x &&= $y
233orassign $x ||= $y
234method Foo->$x()
235entersub f()
236leavesub sub f{} f()
237leavesublv sub f:lvalue{return $x} f()
238caller caller
239warn warn
240die die
241reset reset
242lineseq SKIP
243nextstate SKIP
244dbstate SKIP (needs debugger)
245unstack while(0){}
246enter SKIP
247leave SKIP
248scope SKIP
249enteriter SKIP
250iter SKIP
251enterloop SKIP
252leaveloop SKIP
253return return
254last last
255next next
256redo redo THIS
257dump dump
258goto goto THERE
259exit exit 0
260open open FOO
261close close FOO
262pipe_op pipe FOO,BAR
263fileno fileno FOO
264umask umask 0755, 'foo'
265binmode binmode FOO
266tie tie
267untie untie
268tied tied
269dbmopen dbmopen
270dbmclose dbmclose
271sselect SKIP (set by optimizer)
272select select FOO
273getc getc FOO
274read read FOO
275enterwrite write
276leavewrite SKIP
277prtf printf
278print print
279sysopen sysopen
280sysseek sysseek
281sysread sysread
282syswrite syswrite
283send send
284recv recv
285eof eof FOO
286tell tell
287seek seek FH, $pos, $whence
288truncate truncate FOO, 42
289fcntl fcntl
290ioctl ioctl
291flock flock FOO, 1
292socket socket
293sockpair socketpair
294bind bind
295connect connect
296listen listen
297accept accept
298shutdown shutdown
299gsockopt getsockopt
300ssockopt setsockopt
301getsockname getsockname
302getpeername getpeername
303lstat lstat FOO
304stat stat FOO
305ftrread -R
306ftrwrite -W
307ftrexec -X
308fteread -r
309ftewrite -w
310fteexec -x
311ftis -e
312fteowned SKIP -O
313ftrowned SKIP -o
314ftzero -z
315ftsize -s
316ftmtime -M
317ftatime -A
318ftctime -C
319ftsock -S
320ftchr -c
321ftblk -b
322ftfile -f
323ftdir -d
324ftpipe -p
325ftlink -l
326ftsuid -u
327ftsgid -g
328ftsvtx -k
329fttty -t
330fttext -T
331ftbinary -B
332chdir chdir '/'
333chown chown
334chroot chroot
335unlink unlink 'foo'
336chmod chmod 511, 'foo'
337utime utime
338rename rename 'foo', 'bar'
339link link 'foo', 'bar'
340symlink symlink 'foo', 'bar'
341readlink readlink 'foo'
342mkdir mkdir 'foo'
343rmdir rmdir 'foo'
344open_dir opendir DIR
345readdir readdir DIR
346telldir telldir DIR
347seekdir seekdir DIR, $pos
348rewinddir rewinddir DIR
349closedir closedir DIR
350fork fork
351wait wait
352waitpid waitpid
353system system
354exec exec
355kill kill
356getppid getppid
357getpgrp getpgrp
358setpgrp setpgrp
359getpriority getpriority
360setpriority setpriority
361time time
362tms times
363localtime localtime
364gmtime gmtime
365alarm alarm
366sleep sleep 1
367shmget shmget
368shmctl shmctl
369shmread shmread
370shmwrite shmwrite
371msgget msgget
372msgctl msgctl
373msgsnd msgsnd
374msgrcv msgrcv
375semget semget
376semctl semctl
377semop semop
378require use strict
379dofile do 'file'
380entereval eval "1+1"
381leaveeval eval "1+1"
382entertry SKIP eval { 1+1 }
383leavetry SKIP eval { 1+1 }
384ghbyname gethostbyname 'foo'
385ghbyaddr gethostbyaddr 'foo'
386ghostent gethostent
387gnbyname getnetbyname 'foo'
388gnbyaddr getnetbyaddr 'foo'
389gnetent getnetent
390gpbyname getprotobyname 'foo'
391gpbynumber getprotobynumber 42
392gprotoent getprotoent
393gsbyname getservbyname 'name', 'proto'
394gsbyport getservbyport 'a', 'b'
395gservent getservent
396shostent sethostent
397snetent setnetent
398sprotoent setprotoent
399sservent setservent
400ehostent endhostent
401enetent endnetent
402eprotoent endprotoent
403eservent endservent
404gpwnam getpwnam
405gpwuid getpwuid
406gpwent getpwent
407spwent setpwent
408epwent endpwent
409ggrnam getgrnam
410ggrgid getgrgid
411ggrent getgrent
412sgrent setgrent
413egrent endgrent
414getlogin getlogin
415syscall syscall
416lock SKIP
417threadsv SKIP
418setstate SKIP
419method_named $x->y()
420dor $x // $y
421dorassign $x //= $y
4bc6199f 422once SKIP {use feature 'state'; state $foo = 42;}
423say SKIP {use feature 'say'; say "foo";}
424smartmatch $x ~~ $y
425aeach SKIP each @t
426akeys SKIP keys @t
427avalues SKIP values @t
78396813 428custom SKIP (no way)