develooper Front page | perl.perl5.porters | Postings from June 2016

[perl #128340] in-place sort incorrectly preserves element lvalueidentity

Thread Next
June 7, 2016 19:59
[perl #128340] in-place sort incorrectly preserves element lvalueidentity
Message ID:
# New Ticket Created by  Zefram 
# Please include the string:  [perl #128340]
# in the subject line of all future correspondence about this issue. 
# <URL: >

This is a bug report for perl from,
generated with the help of perlbug 1.40 running under perl 5.24.0.

[Please describe your issue here]

[perl #127759] led me to spot another problem with in-place sort optimisation:

$ perl -le '@c=(55,44,33); $d = \$c[2]; @c = @e = sort { $a <=> $b } @c; $$d = "z"; print @c'
$ perl -le '@c=(55,44,33); $d = \$c[2]; @c = sort { $a <=> $b } @c; $$d = "z"; print @c'

The latter case triggers the in-place sort optimisation, while the former
is semantically equivalent (except for clobbering @e) but does not get
the optimisation.  The former is behaving correctly, in that the array
ends up with fresh element scalars not aliased to the old ones, so the
mutation via reference doesn't affect the new array content.  But with
the in-place optimisation, it turns out that the original element scalars
are merely being rearranged.  The copying to fresh scalars that is part
of list assignment semantics is not happening.

It is incorrect to apply the in-place optimisation if any of the array's
element scalars might be aliased somewhere else.  I considered saying
"has SvREFCNT != 1" there, but I'm concerned about uncounted references
hiding in @_ or elsewhere on the stack.

[Please do not change anything below this line]
Site configuration information for perl 5.24.0:

Configured by zefram at Mon May  9 19:42:55 BST 2016.

Summary of my perl5 (revision 5 version 24 subversion 0) configuration:
    osname=linux, osvers=3.16.0-4-amd64, archname=x86_64-linux-thread-multi
    uname='linux 3.16.0-4-amd64 #1 smp debian 3.16.7-ckt11-1+deb8u6 (2015-11-09) x86_64 gnulinux '
    config_args='-des -Dprefix=/home/zefram/usr/perl/perl_install/perl-5.24.0-i64-f52 -Duselargefiles -Dusethreads -Uafs -Ud_csh -Uusesfio -Uusenm -Duseshrplib -Dusedevel -Uversiononly -Ui_db'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
    cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
    ccversion='', gccversion='4.9.2', gccosandvers=''
    intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678, doublekind=3
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16, longdblkind=3
    ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -fstack-protector-strong -L/usr/local/lib'
    libpth=/usr/local/lib /usr/lib/gcc/x86_64-linux-gnu/4.9/include-fixed /usr/include/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib
    libs=-lpthread -lnsl -ldb -ldl -lm -lcrypt -lutil -lc
    perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc, so=so, useshrplib=true,
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -Wl,-rpath,/home/zefram/usr/perl/perl_install/perl-5.24.0-i64-f52/lib/5.24.0/x86_64-linux-thread-multi/CORE'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector-strong'

@INC for perl 5.24.0:

Environment for perl 5.24.0:
    LANG (unset)
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PERL_BADLANG (unset)

Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About