Perl: Should Math64 :: Int64 work in a "safe" compartment?

(My first post for, hope I use the correct format)

I need to evaluate code that processes 64-bit integers in the "Safe" compartment. Since I supply both the script and the code for the evaluation, I could do a normal evaluation, but I wanted to try to make things more reliable from unintentional errors using "Safe".

Should I expect Math :: Int64 to work correctly inside a "safe" coupe? I get conflicting results on different Perl versions, integer bit widths and OS. (See below).

All failure happens the same inside the debugger.

I am sure that I am making the wrong assumption in some place, but I cannot figure out where.

Thanks for any help you can give.

Sample Code (dummy.pl)

use strict; use warnings; use Exporter; use Safe; use Math::Int64 qw(int64 hex_to_int64); #use Math::Int64 ':native_if_available'; my $safe = new Safe 'Root'; $safe->permit( qw(:browse) ); $safe->share( qw/int64 hex_to_int64 my_sprintf/ ); my $X = 0xFF & (hex_to_int64("0xAA12345678") >> 4); print my_sprintf("X ",$X); my $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 { my ($string, $value) = @_; return sprintf( "Value of %s: %X,\tType: %s\n", $string, $value, ref($value) || "scalar" ); } sub evalme { my($expr, $safe) = @_; my $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 for @Math::Int64::ISA at (eval 5) line 1. ... Can't locate package Exporter for @Math::Int64::ISA at (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 All versions return effectively: Value of X : 67, Type: Math::Int64 Error: Undefined subroutine &Math::Int64::hex_to_int64 called at c:/.../perl5db. at dummy.pl line 35 main::evalme('$X = 0xFF & (hex_to_int64("0xAA12345678") >> 4)', 'Safe=HASH(xxxxxxxx)' 

Version

 "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 this 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 this 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 this binary (from libperl): Compile-time options: ... USE_64_BIT_ALL USE_64_BIT_INT 
+6
source share
1 answer

The problem seems to be related to overload not working inside the secure compartments.

Overloading was one way to bypass Safe so that it could be turned off specifically. If you really want to know, you can request the perl5-porters mailing list.

I do not think that this could be solved from Math :: Int64 (BTW, I am its author).

On the other hand, you can try compiling Perl with 64-bit support.

+1
source

Source: https://habr.com/ru/post/919909/


All Articles