Perl: Should Math64::Int64 work inside a "Safe" Compartment? -
(my first post stack overflow, hope using right format)
i have need evaluate code manipulates 64-bit integers in "safe" compartment. since supply both script , code evaluated, normal eval, wanted try make things more robust unintentional errors using 'safe".
should expect math::int64 should work inside "safe" compartment? conflicting results across different bitness of perl versions, integer bit-width, , oses. (see below).
all fail in same way inside debugger.
i sure making incorrect assumption place, can't figure out where.
thanks can give.
code example (dummy.pl)
use strict; use warnings; use exporter; use safe; use math::int64 qw(int64 hex_to_int64); #use math::int64 ':native_if_available'; $safe = new safe 'root'; $safe->permit( qw(:browse) ); $safe->share( qw/int64 hex_to_int64 my_sprintf/ ); $x = 0xff & (hex_to_int64("0xaa12345678") >> 4); print my_sprintf("x ",$x); $z = evalme('$x = 0xff & (hex_to_int64("0xaa12345678") >> 4)', $safe); print my_sprintf("z ",$z); print evalme('my_sprintf("xe", $x)',$safe); exit; sub my_sprintf { ($string, $value) = @_; return sprintf( "value of %s: %x,\ttype: %s\n", $string, $value, ref($value) || "scalar" ); } sub evalme { my($expr, $safe) = @_; $retval = $safe->reval($expr); die "error: $@\n" if ($@); return $retval; }
execution examples
% perl -w dummy.pl === "win7 x64 sp1, strawberry perl 5.12.3" === value of x : 67, type: math::int64 can't locate package exporter @math::int64::isa @ (eval 5) line 1. ... can't locate package exporter @math::int64::isa @ (eval 5) line 1. value of z : 67, type: math::int64 value of xe: 67, type: math::int64 === "win xp sp3 32-bit strawberry perl 5.16.0" === value of x : 67, type: math::int64 value of z : 8e, type: scalar value of xe: 8e, type: scalar (no ':native-if-available') === "ubuntu 10.04 x86_64 server, perl 5.10.1" === value of x : 67, type: math::int64 value of z : 4d, type: scalar value of xe: 4d, type: scalar (':native-if-available') === "ubuntu 10.04 x86_64 server, perl 5.10.1" === value of x : 67, type: scalar value of z : 71, type: scalar value of xe: 71, type: scalar % perl -wd dummy.pl versions return effectively: value of x : 67, type: math::int64 error: undefined subroutine &math::int64::hex_to_int64 called @ c:/.../perl5db. @ dummy.pl line 35 main::evalme('$x = 0xff & (hex_to_int64("0xaa12345678") >> 4)', 'safe=hash(xxxxxxxx)'
versions
"win7 x64 sp1, strawberry perl 5.12.3": platform: osname=mswin32, osvers=6.1, archname=mswin32-x64-multi-thread uname='win32 strawberryperl 5.12.3.0 #1 sun may 15 09:43:50 2011 x64' use64bitint=define, use64bitall=undef, uselongdouble=undef compiler: intsize=4, longsize=4, ptrsize=8, doublesize=8, byteorder=12345678 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12 ivtype='long long', ivsize=8, nvtype='double', nvsize=8, off_t='long long', characteristics of binary (from libperl): compile-time options: ... use_64_bit_int "win xp 32-bit strawberry perl 5.16.0": platform: osname=mswin32, osvers=4.0, archname=mswin32-x86-multi-thread uname='win32 strawberry-perl 5.16.0.1 #1 mon may 21 22:07:30 2012 i386' use64bitint=undef, use64bitall=undef, uselongdouble=undef compiler: intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234 d_longlong=undef, longlongsize=8, d_longdbl=define, longdblsize=12 ivtype='long', ivsize=4, nvtype='double', nvsize=8, off_t='long long', characteristics of binary (from libperl): compile-time options: ... "ubuntu 10.04 x86_64 server, perl 5.10.1": linux 2.6.32-31-server, platform: use64bitint=define, use64bitall=define, uselongdouble=undef compiler: intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16 ivtype='long', ivsize=8, nvtype='double', nvsize=8, off_t='off_t', characteristics of binary (from libperl): compile-time options: ... use_64_bit_all use_64_bit_int
it seems issue caused overloading not working inside safe compartments.
overloading one of ways circumvent safe may disabled on purpose. can ask on perl5-porters mailing list if want know.
i don't think solved math::int64 (btw, author).
on other hand, can try compiling perl native 64bit support.
Comments
Post a Comment