# New Ticket Created by  kynn jones 
# Please include the string:  [perl #36427]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/rt3/Ticket/Display.html?id=36427 >



This is a bug report for perl from [EMAIL PROTECTED]
generated with the help of perlbug 1.35 running under perl v5.8.6.


-----------------------------------------------------------------
[Please enter your report here]

I first observed this behavior when attempting to save a directed
acyclic graph (DAG) consisting of of about 5,000 nodes, but below I
give a minimalistic example that exhibits the same behavior.

The following script creates a long sequence of nested references.
The command-line argument to the script should be a positive integer,
corresponding to the length of this sequence of references.

With an argument greater than some system-dependent critical size, the
script causes perl to segfault:

use strict;
use warnings;

my $size = shift;

my $x = [];
$x = [ $x ] for 1..$size;

require Storable;
Storable::store( \$x, '/tmp/$0.$$' ) or die;

warn "ok\n";

__END__

For this script, in the system described in this report, the critical
value of the argument is 30826.  With any argument below this number,
the script terminates normally; with an argument greater than or equal
to it, perl segfaults.

Similarly, if the two lines indicated by the "# *" in the script above
are replaced by

require Data::Dumper;
Data::Dumper->Dump( [ \$x ] ) or die;

the resulting script fails for any argument greater than or equal to
15406.

Two important differences between the two versions of the script is
that the one using Storable fails after the 'warn "ok\n"' line, and
always terminates quickly (whether successfully or not), even for
values of the input close to the critical value.  In contrast, for the
version using Data::Dumper, when the script fails the 'warn "ok\n"'
line never executes, and the time to success or failure grows sharply
as the value of the input approaches the critical value.  But with the
DAG object that originally triggered the segfaulting, I observed this
pronounced slowing down near the critical input size with both
Data::Dumper and Storable.

Most likely the reason for the segfaulting is that a sufficiently long
chain of links will cause the serialization process to start
thrashing.  Simply breaking the chain of links in two unconnected
halves allows the serialization to succeed, even though the total
number of links has been reduced by only 1.

[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
    category=library
    severity=medium
---
Site configuration information for perl v5.8.6:

Configured by kynn at Tue Apr 12 12:24:11 EDT 2005.

Summary of my perl5 (revision 5 version 8 subversion 6) configuration:
  Platform:
    osname=linux, osvers=2.4.18-686-smp, archname=i686-linux-ld
    uname='linux luna 2.4.18-686-smp #1 smp sun apr 14 12:07:19 est 2002 i686 
unknown '
    config_args=''
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=undef use5005threads=undef useithreads=undef 
usemultiplicity=undef
    useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
    use64bitint=undef use64bitall=undef uselongdouble=define
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-fno-strict-aliasing -pipe -I/usr/local/include 
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2',
    cppflags='-fno-strict-aliasing -pipe -I/usr/local/include'
    ccversion='', gccversion='2.95.4 20011002 (Debian prerelease)', 
gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='long double', nvsize=12, Off_t='off_t', 
lseeksize=8
    alignbytes=4, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib
    libs=-lnsl -lgdbm -ldbm -ldb -ldl -lm -lcrypt -lutil -lc
    perllibs=-lnsl -ldl -lm -lcrypt -lutil -lc
    libc=/lib/libc-2.2.5.so, so=so, useshrplib=false, libperl=libperl.a
    gnulibc_version='2.2.5'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fpic', lddlflags='-shared -L/usr/local/lib'

Locally applied patches:
    

---
@INC for perl v5.8.6:
    /home/kynn/local/lib/perl/my
    /home/kynn/local/lib/perl/5.8.4
    /home/kynn/local/lib/perl/5.6.1
    /home/kynn/local/lib/perl5/5.8.6/i686-linux-ld
    /home/kynn/local/lib/perl5/5.8.6
    /home/kynn/local/lib/perl5/i686-linux-ld
    /home/kynn/local/lib/perl5
    /home/kynn/local/lib/perl5/5.8.6/i686-linux-ld
    /home/kynn/local/lib/perl5/5.8.6
    /home/kynn/local/lib/perl5/site_perl/5.8.6/i686-linux-ld
    /home/kynn/local/lib/perl5/site_perl/5.8.6
    /home/kynn/local/lib/perl5/site_perl
    .

---
Environment for perl v5.8.6:
    HOME=/home/kynn
    LANG=C
    LANGUAGE (unset)
    LD_LIBRARY_PATH=/home/kynn/local/lib:/opt/java/jdk/lib/i386
    LOGDIR (unset)
    
PATH=.:/home/kynn/local/bin:/home/kynn/local/usr/bin:/home/kynn/local/local/bin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin:/home/kynn/java/javacc/bin:/opt/java/jdk/bin:/usr/pbs/bin:/home/kynn/opt/ant/bin
    
PERL5LIB=/home/kynn/local/lib/perl/my:/home/kynn/local/lib/perl/5.8.4:/home/kynn/local/lib/perl/5.6.1:/home/kynn/local/lib/perl5
    PERL5_CPANPLUS_CONFIG=/home/kynn/.cpanplus/config
    PERL_BADLANG (unset)
    SHELL=/usr/bin/zsh

Reply via email to