On Thu, Mar 25, 2021 at 09:50:17AM +0900, Masato Asou wrote:
> Hi ports,
> 
> The valgrind was aborted after updated Pert to 5.32.1 as below:
> 
> $ sysctl -n kern.version
> OpenBSD 6.9-beta (GENERIC.MP) #428: Wed Mar 24 11:12:16 MDT 2021
>     dera...@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> 
> $ /usr/bin/perl --version
> 
> This is perl 5, version 32, subversion 1 (v5.32.1) built for amd64-openbsd
> </snip>
> 
> $ cd /usr/ports/devel/valgrind
> $ doas make install
> $ valgrind /bin/ls
> Abort trap
> $ 
> 
> Because, Perl 5.32.1 has changed the way hexadecimal string are
> handled as below:
> 
> Perl 5.30.3: "0x1234" + 0x1000 -> 0x2234
> Perl 5.32.1: "0x1234" + 0x1000 -> 0x1000

Interestingly, this bug only existed in perl v5.30, so an unfortunate
accident of timing on the creation of this patch.

$ perldoc perl5320delta | grep -B4 134230 
       •   Perl no longer treats strings starting with "0x" or "0b" as hex or
           binary numbers respectively when converting a string to a number.
           This reverts a change in behaviour inadvertently introduced in perl
           5.30.0 intended to improve precision when converting a string to a
           floating point number. [perl #134230
           <https://rt.perl.org/Ticket/Display.html?id=134230>]


> Perl 5.32.1 does not consider anything after 'x' to be a number, but
> only the first '0' is consider to be a number.

Neither does any other perl 5, only perl 5.30 accidentally did.

Perl simplistically looks for leading ascii digits in in a string to
"convert" from a string to a number, and an empty string is treated as
0.  Just because the unquoted version would be treated differently
isn't supposed to matter.

$ perl -E 'say "$_: " . ( "${_}x123" + 0 ) for qw< 0 1 987 a z >'
0: 0
1: 1
987: 987
a: 0
z: 0



> I made the following patch.
> 
> ok? comments?
> --
> ASOU Masato
> 
> Index: devel/valgrind/patches/patch-coregrind_link_tool_exe_openbsd_in
> ===================================================================
> RCS file: 
> /cvs/ports/devel/valgrind/patches/patch-coregrind_link_tool_exe_openbsd_in,v
> retrieving revision 1.5
> diff -u -p -r1.5 patch-coregrind_link_tool_exe_openbsd_in
> --- devel/valgrind/patches/patch-coregrind_link_tool_exe_openbsd_in     5 Oct 
> 2020 01:45:58 -0000       1.5
> +++ devel/valgrind/patches/patch-coregrind_link_tool_exe_openbsd_in     25 
> Mar 2021 00:27:19 -0000
> @@ -10,7 +10,7 @@
>  +# strip command rewrite offset and align in ELF file. Therefor, when 
> valgrind
>  +# launch memcheck-amd64-openbsd, an Abort trap occurs in the execvp() system
>  +# call.
> -+my $cmd = sprintf "$cc -static -nopie -Wl,--strip-all -Wl,-Ttext=0x%x", 
> "$ala + 0x1000";
> ++my $cmd = sprintf "$cc -static -nopie -Wl,--strip-all -Wl,-Ttext=0x%x", 
> hex($ala) + 0x1000;

This seems to give consistent results on all the perl I have from 5.8
through 5.33.7.

perl -e 'my $ala = "0x1234"; print(( $ala + 0x100 ), "\n"); print(( hex($ala) + 
0x100 ), "\n")'

OK afresh1@


>   
>  -# so, build up the complete command here:
>  -# 'cc' -static -Ttext='ala' 'restargs'
> 

-- 
andrew - http://afresh1.com

Instructions are just another man's opinion of how to do something. 
                      -- Weldboy #DPWisdom

Reply via email to