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

[perl #127786] segfault involving Data::Dumper, anonymous sub, andscalar ref

From:
perlbug-followup
Date:
March 26, 2016 06:12
Subject:
[perl #127786] segfault involving Data::Dumper, anonymous sub, andscalar ref
Message ID:
rt-4.0.18-20650-1458972716-382.127786-75-0@perl.org
# New Ticket Created by   
# Please include the string:  [perl #127786]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/Ticket/Display.html?id=127786 >



This is a bug report for perl from frederik@ofb.net,
generated with the help of perlbug 1.40 running under perl 5.22.1.


-----------------------------------------------------------------
[Please describe your issue here]

I found Perl segfaulting on a personal project and was able to get a
minimal test case which exhibits the problem.

Although the test case uses Data::Dumper, I have
"$Data::Dumper::Useperl=1;" (pure Perl mode) so perhaps this is also a
problem with the Perl interpreter.

The Perl version is v5.22.1. I get a segfault on a x86_64 system with
Linux kernel 4.1.20-1-lts, as well as on a i686 system with Linux
kernel 4.1.19-1-lts. Both are running up-to-date Arch distributions.

On a Debian system with Perl v5.14.2, there is no segfault. (This
system is i686 with Linux kernel 3.2.45)

Here is the test case:

    #!/usr/bin/perl

    use warnings;
    use strict;

    ## This block mostly copied from my personal helper/utility package:
    BEGIN {
      do {
        # Declaring this in package DB results in special "eval" behavior:
        # the expression is evaluated in the first non-DB lexical scope
        package DB;

        use Data::Dumper;
        $Data::Dumper::Indent=0;
        $Data::Dumper::Purity=1;
        $Data::Dumper::Terse=1;
        ## oddly, I get a segfault when this is either 1 or 0:
        $Data::Dumper::Useperl=1;

        # "Print value": display an expression, and then its value.
        # Evaluates the expression in the context of the caller. Useful for
        # debugging: just substitute "pv q{EXPR}" for "EXPR" when you want
        # to examine its value. EXPR should be a scalar, but arrays and
        # hashes can be made into scalars with [] and {}.
        sub pv {
          my $e = shift;
          my ($package, $filename, $line) = caller;
          my $v = Dumper(eval "package $package; ($e)");
          die $@ if $@;
          print STDERR "$e = $v\n";
        }
      };
      *pv = \&DB::pv;
    }

    ################################################################
    ## Here is a (hopefully) minimal test case to cause a segfault on Perl
    ## v5.22.1. I also tested on Perl v5.14.2, no segfault.

    my $s = "hi";
    my $foo = sub { # this sub needs to be anonymous
      warn $s;      # we need this line here
      pv '$s';      # this succeeds
      pv '\$s';     # this segfaults
    };
    &$foo();

Here's the output:

    $ ./perl-dumper-ref-bug
    hi at ./perl-dumper-ref-bug line 42.
    $s = 'hi'
    zsh: segmentation fault (core dumped)  ./perl-dumper-ref-bug

Thank you!

[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
    category=library
    severity=medium
    module=Data::Dumper
---
Site configuration information for perl 5.22.1:

Configured by builduser at Mon Mar  7 19:10:52 CET 2016.

Summary of my perl5 (revision 5 version 22 subversion 1) configuration:
   
  Platform:
    osname=linux, osvers=4.4.3-1-arch, archname=x86_64-linux-thread-multi
    uname='linux flo-64 4.4.3-1-arch #1 smp preempt fri feb 26 15:09:29 cet 2016 x86_64 gnulinux '
    config_args='-des -Dusethreads -Duseshrplib -Doptimize=-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -Dprefix=/usr -Dvendorprefix=/usr -Dprivlib=/usr/share/perl5/core_perl -Darchlib=/usr/lib/perl5/core_perl -Dsitelib=/usr/share/perl5/site_perl -Dsitearch=/usr/lib/perl5/site_perl -Dvendorlib=/usr/share/perl5/vendor_perl -Dvendorarch=/usr/lib/perl5/vendor_perl -Dscriptdir=/usr/bin/core_perl -Dsitescript=/usr/bin/site_perl -Dvendorscript=/usr/bin/vendor_perl -Dinc_version_list=none -Dman1ext=1perl -Dman3ext=3perl -Dcccdlflags='-fPIC' -Dlddlflags=-shared -Wl,-O1,--sort-common,--as-needed,-z,relro -Dldflags=-Wl,-O1,--sort-common,--as-needed,-z,relro'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    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',
    optimize='-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
    ccversion='', gccversion='5.3.0', 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 ='-Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector-strong -L/usr/local/lib'
    libpth=/usr/local/lib /usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/include-fixed /usr/lib /lib/../lib /usr/lib/../lib /lib /lib64 /usr/lib64
    libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat
    perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
    libc=libc-2.23.so, so=so, useshrplib=true, libperl=libperl.so
    gnulibc_version='2.23'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -Wl,-rpath,/usr/lib/perl5/core_perl/CORE'
    cccdlflags='-fPIC', lddlflags='-shared -Wl,-O1,--sort-common,--as-needed,-z,relro -L/usr/local/lib -fstack-protector-strong'


---
@INC for perl 5.22.1:
    /home/frederik/scripts-misc/perl
    /home/frederik/.local/lib/perl5/x86_64-linux-thread-multi
    /home/frederik/.local/lib/perl5
    /usr/lib/perl5/site_perl
    /usr/share/perl5/site_perl
    /usr/lib/perl5/vendor_perl
    /usr/share/perl5/vendor_perl
    /usr/lib/perl5/core_perl
    /usr/share/perl5/core_perl
    .

---
Environment for perl 5.22.1:
    HOME=/home/frederik
    LANG=en_US.UTF-8
    LANGUAGE (unset)
    LD_LIBRARY_PATH=/home/frederik/.local/arch/x86_64/lib:/home/frederik/.local/lib:/usr/local/lib
    LOGDIR (unset)
    PATH=/home/frederik/.local/bin:/home/frederik/projects/mailproc:/home/frederik/scripts-misc:/home/frederik/.local/arch/x86_64/bin:/usr/bin/core_perl:/usr/bin/vendor_perl:/usr/bin/site_perl:/usr/local/bin:/usr/local/sbin:/usr/bin
    PERL5LIB=/home/frederik/scripts-misc/perl:/home/frederik/.local/lib/perl5:
    PERL_BADLANG (unset)
    PERL_LOCAL_LIB_ROOT=/home/frederik/.local/:/home/frederik/.local/:/home/frederik/.local/
    PERL_MB_OPT=--install_base "/home/frederik/.local/"
    PERL_MM_OPT=INSTALL_BASE=/home/frederik/.local/
    SHELL=/bin/zsh




nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About