Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sv_rvweaken (Scalar::Util::weaken) is inneffective on tied variables #7848

Closed
p5pRT opened this issue Mar 21, 2005 · 9 comments
Closed

sv_rvweaken (Scalar::Util::weaken) is inneffective on tied variables #7848

p5pRT opened this issue Mar 21, 2005 · 9 comments

Comments

@p5pRT
Copy link

p5pRT commented Mar 21, 2005

Migrated from rt.perl.org#34524 (status was 'rejected')

Searchable as RT34524$

@p5pRT
Copy link
Author

p5pRT commented Mar 1, 2005

From philippe.cote@usherbrooke.ca

Created by philippe.cote@usherbrooke.ca

I think there is a bug in sv_rvweaken on tied variables

------------------------------------------------------------------------------------------------------------
Sample code
------------------------------------------------------------------------------------------------------------
#!/usr/bin/perl

use Scalar​::Util qw(weaken isweak);
use Devel​::Peek qw(Dump);
my (@​a, @​b);
tie @​a, 'Monitor​::TestArray';
tie @​b, 'Monitor​::TestArray';
$a[0] = \@​b;
$b[0] = \@​a;
print Dump($b[0])."\n";
weaken($b[0]);
print Dump($b[0])."\n";
if (isweak($a[0])) {
  print "\$a[0] is weak\n";
} else {
  print "\$a[0] is not weak\n";
}
if (isweak($b[0])) {
  print "\$b[0] is weak\n";
} else {
  print "\$b[0] is not weak\n";
}

package Monitor​::TestArray;
use Tie​::Array;
use base 'Tie​::StdArray';

sub DESTROY { "Monitor​::TestArray​::DESTROY : $_[0]\n"; }

1;

------------------------------------------------------------------------------------------------------------
Output
------------------------------------------------------------------------------------------------------------

SV = PVLV(0x818cd80) at 0x814e86c
  REFCNT = 1
  FLAGS = (TEMP,GMG,SMG,RMG)
  IV = 0
  NV = 0
  PV = 0
  MAGIC = 0x81dca98
  MG_VIRTUAL = &PL_vtbl_packelem
  MG_TYPE = PERL_MAGIC_tiedelem(p)
  MG_FLAGS = 0x02
  REFCOUNTED
  MG_OBJ = 0x81413cc
  SV = RV(0x816e04c) at 0x81413cc
  REFCNT = 2
  FLAGS = (ROK)
  RV = 0x8141378
  SV = PVAV(0x81de364) at 0x8141378
  REFCNT = 1
  FLAGS = (OBJECT)
  IV = 0
  NV = 0
  STASH = 0x81c26e0 "Monitor​::TestArray"
  ARRAY = 0x8148bc0
  FILL = 0
  MAX = 3
  ARYLEN = 0x0
  FLAGS = (REAL)
  Elt No. 0
  SV = PVNV(0x81de718) at 0x81dd064
  REFCNT = 1
  FLAGS = (ROK)
  IV = 0
  NV = 0
  RV = 0x814e89c
  SV = PVAV(0x81426cc) at 0x814e89c
  REFCNT = 2
  FLAGS = (PADBUSY,PADMY,RMG)
  IV = 0
  NV = 0
  MAGIC = 0x81de118
  MG_VIRTUAL = &PL_vtbl_pack
  MG_TYPE = PERL_MAGIC_tied(P)
  MG_FLAGS = 0x02
  REFCOUNTED
  MG_OBJ = 0x8141330
  SV = RV(0x816e030) at 0x8141330
  REFCNT = 1
  FLAGS = (ROK)
  RV = 0x81412e8
  ARRAY = 0x0
  FILL = -1
  MAX = -1
  ARYLEN = 0x0
  FLAGS = (REAL)
  PV = 0x814e89c ""
  CUR = 0
  LEN = 0
  TYPE = t
  TARGOFF = 0
  TARGLEN = 0
  TARG = 0x814e86c

SV = PVLV(0x818cd80) at 0x814e86c
  REFCNT = 1
  FLAGS = (TEMP,GMG,SMG,RMG)
  IV = 0
  NV = 0
  PV = 0
  MAGIC = 0x8153608
  MG_VIRTUAL = &PL_vtbl_packelem
  MG_TYPE = PERL_MAGIC_tiedelem(p)
  MG_FLAGS = 0x02
  REFCOUNTED
  MG_OBJ = 0x81413cc
  SV = RV(0x816e04c) at 0x81413cc
  REFCNT = 2
  FLAGS = (ROK)
  RV = 0x8141378
  SV = PVAV(0x81de364) at 0x8141378
  REFCNT = 1
  FLAGS = (OBJECT)
  IV = 0
  NV = 0
  STASH = 0x81c26e0 "Monitor​::TestArray"
  ARRAY = 0x8148bc0
  FILL = 0
  MAX = 3
  ARYLEN = 0x0
  FLAGS = (REAL)
  Elt No. 0
  SV = PVNV(0x81de718) at 0x81dd064
  REFCNT = 1
  FLAGS = (ROK)
  IV = 0
  NV = 0
  RV = 0x814e89c
  SV = PVAV(0x81426cc) at 0x814e89c
  REFCNT = 2
  FLAGS = (PADBUSY,PADMY,RMG)
  IV = 0
  NV = 0
  MAGIC = 0x81de118
  MG_VIRTUAL = &PL_vtbl_pack
  MG_TYPE = PERL_MAGIC_tied(P)
  MG_FLAGS = 0x02
  REFCOUNTED
  MG_OBJ = 0x8141330
  SV = RV(0x816e030) at 0x8141330
  REFCNT = 1
  FLAGS = (ROK)
  RV = 0x81412e8
  ARRAY = 0x0
  FILL = -1
  MAX = -1
  ARYLEN = 0x0
  FLAGS = (REAL)
  PV = 0x814e89c ""
  CUR = 0
  LEN = 0
  TYPE = t
  TARGOFF = 0
  TARGLEN = 0
  TARG = 0x814e86c

$a[0] is not weak
$b[0] is not weak

-------------------------------------------------------------------------------
But if I remove the line "tie @​b, 'Tie​::StdArray';", the last print will
be "$b[0] is weak"

Internal code from Scalar​::Util​::weaken and Scalar​::Util​::isweak is :
-------------------------------------------------------------------------------
void
weaken(sv)
  SV *sv
PROTOTYPE​: $
CODE​:
#ifdef SvWEAKREF
  sv_rvweaken(sv);
#else
  croak("weak references are not implemented in this release of perl");
#endif
 
void
isweak(sv)
  SV *sv
PROTOTYPE​: $
CODE​:
#ifdef SvWEAKREF
  ST(0) = boolSV(SvROK(sv) && SvWEAKREF(sv));
  XSRETURN(1);
#else
  croak("weak references are not implemented in this release of perl");
#endif
-------------------------------------------------------------------------------
Which seems ok to me.

Conclusion : sv_rvweaken doesn't seem to handle tied values very well

Perl Info

Flags:
    category=core
    severity=medium

Site configuration information for perl v5.8.6:

Configured by Gentoo at Mon Feb 28 13:17:43 EST 2005.

Summary of my perl5 (revision 5 version 8 subversion 6) configuration:
  Platform:
    osname=linux, osvers=2.6.5-gentoo-r1, archname=i686-linux
    uname='linux denethor 2.6.5-gentoo-r1 #1 fri may 28 17:11:18 edt 
2004 i686 intel(r) pentium(r) 4 cpu 2.40ghz genuineintel gnulinux '
    config_args='-des -Darchname=i686-linux -Dcccdlflags=-fPIC 
-Dccdlflags=-rdynamic -Dcc=gcc -Dprefix=/usr -Dvendorprefix=/usr 
-Dsiteprefix=/usr -Dlocincpth=  -Doptimize=-O3 -march=pentium4 
-fomit-frame-pointer -pipe -Duselargefiles -Dd_semctl_semun 
-Dscriptdir=/usr/bin -Dman1dir=/usr/share/man/man1 
-Dman3dir=/usr/share/man/man3 -Dinstallman1dir=/usr/share/man/man1 
-Dinstallman3dir=/var/tmp/portage/perl-5.8.6-r2/image//usr/share/man/man3 
-Dman1ext=1 -Dman3ext=3pm -Dinc_version_list=5.8.2 5.8.2/i686-linux 
5.8.4 5.8.4/i686-linux 5.8.5 5.8.5/i686-linux  -Dcf_by=Gentoo -Ud_csh 
-Di_ndbm -Di_gdbm -Di_db'
    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=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='gcc', ccflags ='-fno-strict-aliasing -pipe -D_LARGEFILE_SOURCE 
-D_FILE_OFFSET_BITS=64',
    optimize='-O3 -march=pentium4 -fomit-frame-pointer -pipe',
    cppflags='-DPERL5 -fno-strict-aliasing -pipe'
    ccversion='', gccversion='3.3.3 20040217 (Gentoo Linux 3.3.3, 
propolice-3.3-7)', 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='double', nvsize=8, Off_t='off_t', 
lseeksize=8
    alignbytes=4, prototype=define
  Linker and Libraries:
    ld='gcc', ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib
    libs=-lpthread -lnsl -lndbm -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc
    perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
    libc=/lib/libc-2.3.3.so, so=so, useshrplib=false, libperl=libperl.a
    gnulibc_version='2.3.3'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic'
    cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'

Locally applied patches:
    


@INC for perl v5.8.6:
    /var/www/localhost/webapps
    /usr/local/inHousePerlLib/OOSGD/modules/
    /usr/local/inHousePerlLib/monadb/modules/
    /usr/local/inHousePerlLib/ensembl/modules
    /usr/local/inHousePerlLib
    /etc/perl
    /usr/lib/perl5/site_perl/5.8.6/i686-linux
    /usr/lib/perl5/site_perl/5.8.6
    /usr/lib/perl5/site_perl/5.8.2
    /usr/lib/perl5/site_perl/5.8.2/i686-linux
    /usr/lib/perl5/site_perl
    /usr/lib/perl5/vendor_perl/5.8.6/i686-linux
    /usr/lib/perl5/vendor_perl/5.8.6
    /usr/lib/perl5/vendor_perl/5.8.2
    /usr/lib/perl5/vendor_perl/5.8.2/i686-linux
    /usr/lib/perl5/vendor_perl
    /usr/lib/perl5/5.8.6/i686-linux
    /usr/lib/perl5/5.8.6
    /usr/local/lib/site_perl
    /usr/lib/perl5/site_perl/5.8.2
    /usr/lib/perl5/site_perl/5.8.2/i686-linux
    .


Environment for perl v5.8.6:
    HOME=/home/philippe
    LANG (unset)
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    
PATH=/usr/kde/3.2/bin:/bin:/usr/bin:/usr/local/bin:/opt/bin:/usr/i686-pc-linux-gnu/gcc-bin/3.3:/opt/Acrobat5:/usr/X11R6/bin:/opt/blackdown-jdk-1.4.1/bin:/opt/blackdown-jdk-1.4.1/jre/bin:/usr/qt/3/bin:/usr/kde/3.1/bin
    
PERL5LIB=/var/www/localhost/webapps:/usr/local/inHousePerlLib/OOSGD/modules/:/usr/local/inHousePerlLib/monadb/modules/:/usr/local/inHousePerlLib/ensembl/modules:/usr/local/inHousePerlLib
    PERL_BADLANG (unset)
    SHELL=/bin/zsh

@p5pRT
Copy link
Author

p5pRT commented Mar 21, 2005

From philippe.cote@usherbrooke.ca

To​: perlbug@​perl.org
Subject​: sv_rvweaken (Scalar​::Util​::weaken) is inneffective on tied
variables
Cc​: philippe.cote@​usherbrooke.ca
Reply-To​: philippe.cote@​usherbrooke.ca
Message-Id​: <5.8.6_16236_1111437479@​denethor.med.usherbrooke.ca>

This is a bug report for perl from philippe.cote@​usherbrooke.ca,
generated with the help of perlbug 1.35 running under perl v5.8.6.

Hi,

sv_rvweaken doesn't handle tied variables

Proof :

+-------------------------------------------------------------------------+
Sample code
+-------------------------------------------------------------------------+
#!/usr/bin/perl
use strict;
use warnings;
use Util​::Monitor;

use Scalar​::Util qw(weaken);
use Devel​::Peek;
{
  my (@​a);
  $a[0] = \@​a;
  #tie @​a, 'TestArray';
  Dump($a[0],1);
  weaken($a[0]);
  Dump($a[0],1);
  print "Leaving scope\n";
}
print "Scope left\n";

package TestArray;
use Tie​::Array;
use base 'Tie​::StdArray';

sub DESTROY { print "Monitor​::TestArray​::DESTROY : $_[0]\n"; }

1;

+-------------------------------------------------------------------------+
Output without "tie @​a, 'TestArray'"
(Just to show you that weaken works without the tie)
+-------------------------------------------------------------------------+
SV = RV(0x81829c0) at 0x814127c
  REFCNT = 1
  FLAGS = (ROK)
  RV = 0x814e740
  SV = PVAV(0x81426cc) at 0x814e740
  REFCNT = 2
  FLAGS = (PADBUSY,PADMY)
  IV = 0
  NV = 0
  ARRAY = 0x8148888
  FILL = 0
  MAX = 3
  ARYLEN = 0x0
  FLAGS = (REAL)
SV = RV(0x81829c0) at 0x814127c
  REFCNT = 1
  FLAGS = (ROK,WEAKREF,IsUV)
  RV = 0x814e740
  SV = PVAV(0x81426cc) at 0x814e740
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,RMG)
  IV = 0
  NV = 0
  MAGIC = 0x8266f08
  MG_VIRTUAL = &PL_vtbl_backref
  MG_TYPE = PERL_MAGIC_backref(<)
  MG_FLAGS = 0x02
  REFCOUNTED
  MG_OBJ = 0x81411c8
  SV = PVAV(0x8263704) at 0x81411c8
  REFCNT = 2
  FLAGS = ()
  IV = 0
  NV = 0
  ARRAY = 0x82677e8
  FILL = 0
  MAX = 3
  ARYLEN = 0x0
  FLAGS = (REAL)
  ARRAY = 0x8148888
  FILL = 0
  MAX = 3
  ARYLEN = 0x0
  FLAGS = (REAL)
Leaving scope
Scope left

+-------------------------------------------------------------------------+
Output with "tie @​a, 'TestArray';"
+-------------------------------------------------------------------------+
SV = PVLV(0x817c568) at 0x81413f0
  REFCNT = 1
  FLAGS = (TEMP,GMG,SMG,RMG)
  IV = 0
  NV = 0
  PV = 0
  MAGIC = 0x81505b8
  MG_VIRTUAL = &PL_vtbl_packelem
  MG_TYPE = PERL_MAGIC_tiedelem(p)
  MG_FLAGS = 0x02
  REFCOUNTED
  MG_OBJ = 0x814139c
  SV = RV(0x81829ac) at 0x814139c
  REFCNT = 2
  FLAGS = (ROK)
  RV = 0x8141354
  TYPE = t
  TARGOFF = 0
  TARGLEN = 0
  TARG = 0x81413f0
SV = PVLV(0x817c568) at 0x81413f0
  REFCNT = 1
  FLAGS = (TEMP,GMG,SMG,RMG)
  IV = 0
  NV = 0
  PV = 0
  MAGIC = 0x81505b8
  MG_VIRTUAL = &PL_vtbl_packelem
  MG_TYPE = PERL_MAGIC_tiedelem(p)
  MG_FLAGS = 0x02
  REFCOUNTED
  MG_OBJ = 0x814139c
  SV = RV(0x81829ac) at 0x814139c
  REFCNT = 2
  FLAGS = (ROK)
  RV = 0x8141354
  TYPE = t
  TARGOFF = 0
  TARGLEN = 0
  TARG = 0x81413f0
Leaving scope
Scope left
Monitor​::TestArray​::DESTROY : TestArray=ARRAY(0x8141354)

+-------------------------------------------------------------------------+
Explanations
+-------------------------------------------------------------------------+
We see that weaken is not applied on a tied variable. I've been
searching in source code and calls goes like this :

Scalar​::Util​::weaken -> sv_rvweaken -> Perl_sv_rvweaken

+-------------------------------------------------------------------------+
Scalar​::Util​::weaken source code
+-------------------------------------------------------------------------+
void
weaken(sv)
  SV *sv
PROTOTYPE​: $
CODE​:
#ifdef SvWEAKREF
  sv_rvweaken(sv);
#else
  croak("weak references are not implemented in this release of perl");
#endif

We see clearly that it only calls sv_rvweaken from the perl source code.
So this method doesn't contain bugs.
We also finds that sv_rvweaken is associated to Perl_sv_rvweaken as
defined by embed.h
Let's look at this code

+-------------------------------------------------------------------------+
Perl_sv_rvweaken source code from sv.c
+-------------------------------------------------------------------------+
/*
=for apidoc sv_rvweaken

Weaken a reference​: set the C<SvWEAKREF> flag on this RV; give the
referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
push a back-reference to this RV onto the array of backreferences
associated with that magic.

=cut
*/

SV *
Perl_sv_rvweaken(pTHX_ SV *sv)
{
  SV *tsv;
  if (!SvOK(sv)) /* let undefs pass */
  return sv;
  if (!SvROK(sv))
  Perl_croak(aTHX_ "Can't weaken a nonreference");
  else if (SvWEAKREF(sv)) {
  if (ckWARN(WARN_MISC))
  Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is
already weak");
  return sv;
  }
  tsv = SvRV(sv);
  sv_add_backref(tsv, sv);
  SvWEAKREF_on(sv);
  SvREFCNT_dec(tsv);
  return sv;
}

+-------------------------------------------------------------------------+
Conclusion
+-------------------------------------------------------------------------+
The bug is in Perl_sv_rvweaken there :
  if (!SvOK(sv)) /* let undefs pass */
  return sv;
This code should be modified like this :
if (!SvOK(sv)) /* undef var or tied object or something else */
  if (SvMAGIC(sv)) {
  //********************************************/
  //********************************************/
  //********************************************/
  //APPLY WEAKEN HERE (Which I don't know how)
  //********************************************/
  //********************************************/
  //********************************************/
  } else {
  return sv;
  }
}

Thank you

Philippe Cote
Centre de genomique fonctionnelle du Canada


Flags​:
  category=core
  severity=high


Site configuration information for perl v5.8.6​:

Configured by Gentoo at Mon Feb 28 13​:17​:43 EST 2005.

Summary of my perl5 (revision 5 version 8 subversion 6) configuration​:
  Platform​:
  osname=linux, osvers=2.6.5-gentoo-r1, archname=i686-linux
  uname='linux denethor 2.6.5-gentoo-r1 #1 fri may 28 17​:11​:18 edt
2004 i686 intel(r) pentium(r) 4 cpu 2.40ghz genuineintel gnulinux '
  config_args='-des -Darchname=i686-linux -Dcccdlflags=-fPIC
-Dccdlflags=-rdynamic -Dcc=gcc -Dprefix=/usr -Dvendorprefix=/usr
-Dsiteprefix=/usr -Dlocincpth= -Doptimize=-O3 -march=pentium4
-fomit-frame-pointer -pipe -Duselargefiles -Dd_semctl_semun
-Dscriptdir=/usr/bin -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dinstallman1dir=/usr/share/man/man1
-Dinstallman3dir=/var/tmp/portage/perl-5.8.6-r2/image//usr/share/man/man3
-Dman1ext=1 -Dman3ext=3pm -Dinc_version_list=5.8.2 5.8.2/i686-linux
5.8.4 5.8.4/i686-linux 5.8.5 5.8.5/i686-linux -Dcf_by=Gentoo -Ud_csh
-Di_ndbm -Di_gdbm -Di_db'
  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=undef
  usemymalloc=n, bincompat5005=undef
  Compiler​:
  cc='gcc', ccflags ='-fno-strict-aliasing -pipe -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64',
  optimize='-O3 -march=pentium4 -fomit-frame-pointer -pipe',
  cppflags='-DPERL5 -fno-strict-aliasing -pipe'
  ccversion='', gccversion='3.3.3 20040217 (Gentoo Linux 3.3.3,
propolice-3.3-7)', 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='double', nvsize=8, Off_t='off_t',
lseeksize=8
  alignbytes=4, prototype=define
  Linker and Libraries​:
  ld='gcc', ldflags =' -L/usr/local/lib'
  libpth=/usr/local/lib /lib /usr/lib
  libs=-lpthread -lnsl -lndbm -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc
  perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
  libc=/lib/libc-2.3.3.so, so=so, useshrplib=false, libperl=libperl.a
  gnulibc_version='2.3.3'
  Dynamic Linking​:
  dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic'
  cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'

Locally applied patches​:


@​INC for perl v5.8.6​:
  /usr/local/inHousePerlLib
  /var/www/localhost/webapps
  /usr/local/inHousePerlLib/monadb/modules
  /var/www/localhost/webapps
  /usr/local/inHousePerlLib/OOSGD/modules/
  /usr/local/inHousePerlLib/monadb/modules/
  /usr/local/inHousePerlLib/ensembl/modules
  /usr/local/inHousePerlLib
  /etc/perl
  /usr/lib/perl5/site_perl/5.8.6/i686-linux
  /usr/lib/perl5/site_perl/5.8.6
  /usr/lib/perl5/site_perl/5.8.2
  /usr/lib/perl5/site_perl/5.8.2/i686-linux
  /usr/lib/perl5/site_perl
  /usr/lib/perl5/vendor_perl/5.8.6/i686-linux
  /usr/lib/perl5/vendor_perl/5.8.6
  /usr/lib/perl5/vendor_perl/5.8.2
  /usr/lib/perl5/vendor_perl/5.8.2/i686-linux
  /usr/lib/perl5/vendor_perl
  /usr/lib/perl5/5.8.6/i686-linux
  /usr/lib/perl5/5.8.6
  /usr/local/lib/site_perl
  /usr/lib/perl5/site_perl/5.8.2
  /usr/lib/perl5/site_perl/5.8.2/i686-linux
  .


Environment for perl v5.8.6​:
  HOME=/home/philippe
  LANG (unset)
  LANGUAGE (unset)
  LD_LIBRARY_PATH (unset)
  LOGDIR (unset)

PATH=/usr/kde/3.2/bin​:/bin​:/usr/bin​:/usr/local/bin​:/opt/bin​:/usr/i686-pc-linux-gnu/gcc-bin/3.3​:/opt/Acrobat5​:/usr/X11R6/bin​:/opt/blackdown-jdk-1.4.1/bin​:/opt/blackdown-jdk-1.4.1/jre/bin​:/usr/qt/3/bin​:/usr/kde/3.1/bin

PERL5LIB=/usr/local/inHousePerlLib​:/var/www/localhost/webapps​:/usr/local/inHousePerlLib/monadb/modules​:/var/www/localhost/webapps​:/usr/local/inHousePerlLib/OOSGD/modules/​:/usr/local/inHousePerlLib/monadb/modules/​:/usr/local/inHousePerlLib/ensembl/modules​:/usr/local/inHousePerlLib
  PERL_BADLANG (unset)
  SHELL=/bin/zsh

Complete configuration data for perl v5.8.6​:

Author=''
CONFIG='true'
Date='$Date'
Header=''
Id='$Id'
Locker=''
Log='$Log'
Mcc='Mcc'
PATCHLEVEL='8'
PERL_API_REVISION='5'
PERL_API_SUBVERSION='0'
PERL_API_VERSION='8'
PERL_CONFIG_SH='true'
PERL_REVISION='5'
PERL_SUBVERSION='6'
PERL_VERSION='8'
RCSfile='$RCSfile'
Revision='$Revision'
SUBVERSION='6'
Source=''
State=''
_a='.a'
_exe=''
_o='.o'
afs='false'
afsroot='/afs'
alignbytes='4'
ansi2knr=''
aphostname='/bin/hostname'
api_revision='5'
api_subversion='0'
api_version='8'
api_versionstring='5.8.0'
ar='ar'
archlib='/usr/lib/perl5/5.8.6/i686-linux'
archlibexp='/usr/lib/perl5/5.8.6/i686-linux'
archname='i686-linux'
archname64=''
archobjs=''
asctime_r_proto='0'
awk='awk'
baserev='5.0'
bash=''
bin='/usr/bin'
binexp='/usr/bin'
bison='bison'
byacc='byacc'
byteorder='1234'
c=''
castflags='0'
cat='cat'
cc='gcc'
cccdlflags='-fPIC'
ccdlflags='-rdynamic'
ccflags='-fno-strict-aliasing -pipe -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64'
ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
ccname='gcc'
ccsymbols='__GNUC_MINOR__=3 __GNUC_PATCHLEVEL__=3'
ccversion=''
cf_by='Gentoo'
cf_email='Gentoo@​denethor.med.usherbrooke.ca'
cf_time='Mon Feb 28 13​:17​:43 EST 2005'
charsize='1'
chgrp=''
chmod='chmod'
chown=''
clocktype='clock_t'
comm='comm'
compress=''
config_arg0='Configure'
config_arg1='-des'
config_arg10='-Doptimize=-O3 -march=pentium4 -fomit-frame-pointer -pipe'
config_arg11='-Duselargefiles'
config_arg12='-Dd_semctl_semun'
config_arg13='-Dscriptdir=/usr/bin'
config_arg14='-Dman1dir=/usr/share/man/man1'
config_arg15='-Dman3dir=/usr/share/man/man3'
config_arg16='-Dinstallman1dir=/usr/share/man/man1'
config_arg17='-Dinstallman3dir=/usr/share/man/man3'
config_arg18='-Dman1ext=1'
config_arg19='-Dman3ext=3pm'
config_arg2='-Darchname=i686-linux'
config_arg20='-Dinc_version_list=5.8.2 5.8.2/i686-linux 5.8.4
5.8.4/i686-linux 5.8.5 5.8.5/i686-linux '
config_arg21='-Dcf_by=Gentoo'
config_arg22='-Ud_csh'
config_arg23='-Di_ndbm'
config_arg24='-Di_gdbm'
config_arg25='-Di_db'
config_arg3='-Dcccdlflags=-fPIC'
config_arg4='-Dccdlflags=-rdynamic'
config_arg5='-Dcc=gcc'
config_arg6='-Dprefix=/usr'
config_arg7='-Dvendorprefix=/usr'
config_arg8='-Dsiteprefix=/usr'
config_arg9='-Dlocincpth= '
config_argc='25'
config_args='-des -Darchname=i686-linux -Dcccdlflags=-fPIC
-Dccdlflags=-rdynamic -Dcc=gcc -Dprefix=/usr -Dvendorprefix=/usr
-Dsiteprefix=/usr -Dlocincpth= -Doptimize=-O3 -march=pentium4
-fomit-frame-pointer -pipe -Duselargefiles -Dd_semctl_semun
-Dscriptdir=/usr/bin -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dinstallman1dir=/usr/share/man/man1
-Dinstallman3dir=/var/tmp/portage/perl-5.8.6-r2/image//usr/share/man/man3
-Dman1ext=1 -Dman3ext=3pm -Dinc_version_list=5.8.2 5.8.2/i686-linux
5.8.4 5.8.4/i686-linux 5.8.5 5.8.5/i686-linux -Dcf_by=Gentoo -Ud_csh
-Di_ndbm -Di_gdbm -Di_db'
contains='grep'
cp='cp'
cpio=''
cpp='cpp'
cpp_stuff='42'
cppccsymbols='__GNUC__=3'
cppflags='-fno-strict-aliasing -pipe'
cpplast='-'
cppminus='-'
cpprun='gcc -E'
cppstdin='gcc -E'
cppsymbols='__ELF__=1 _FILE_OFFSET_BITS=64 __GLIBC__=2 __GLIBC_MINOR__=3
__GNUC_MINOR__=3 __GNU_LIBRARY__=6 _LARGEFILE_SOURCE=1
_POSIX_C_SOURCE=199506 _POSIX_SOURCE=1 __STDC__=1 __USE_BSD=1
__USE_FILE_OFFSET64=1 __USE_LARGEFILE=1 __USE_MISC=1 __USE_POSIX=1
__USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USE_SVID=1
i386=1 __i386=1 __i386__=1 linux=1 __linux=1 __linux__=1 unix=1 __unix=1
__unix__=1'
crypt_r_proto='0'
cryptlib=''
csh='csh'
ctermid_r_proto='0'
ctime_r_proto='0'
d_Gconvert='gcvt((x),(n),(b))'
d_PRIEUldbl='define'
d_PRIFUldbl='define'
d_PRIGUldbl='define'
d_PRIXU64='define'
d_PRId64='define'
d_PRIeldbl='define'
d_PRIfldbl='define'
d_PRIgldbl='define'
d_PRIi64='define'
d_PRIo64='define'
d_PRIu64='define'
d_PRIx64='define'
d_SCNfldbl='define'
d__fwalk=''
d_access='define'
d_accessx=''
d_aintl=''
d_alarm='define'
d_archlib='define'
d_asctime_r=''
d_atolf=''
d_atoll='define'
d_attribut='define'
d_bcmp='define'
d_bcopy='define'
d_bsd=''
d_bsdgetpgrp=''
d_bsdsetpgrp=''
d_bzero='define'
d_casti32=''
d_castneg='define'
d_charvspr='define'
d_chown='define'
d_chroot='define'
d_chsize=''
d_class=''
d_closedir='define'
d_cmsghdr_s='define'
d_const='define'
d_copysignl='define'
d_crypt='define'
d_crypt_r=''
d_csh=''
d_ctermid_r=''
d_ctime_r=''
d_cuserid='define'
d_dbl_dig='define'
d_dbminitproto=''
d_difftime='define'
d_dirfd='define'
d_dirnamlen=''
d_dlerror='define'
d_dlopen='define'
d_dlsymun=''
d_dosuid=''
d_drand48_r=''
d_drand48proto='define'
d_dup2='define'
d_eaccess=''
d_endgrent='define'
d_endgrent_r=''
d_endhent='define'
d_endhostent_r=''
d_endnent='define'
d_endnetent_r=''
d_endpent='define'
d_endprotoent_r=''
d_endpwent='define'
d_endpwent_r=''
d_endsent='define'
d_endservent_r=''
d_eofnblk='define'
d_eunice=''
d_faststdio=''
d_fchdir='define'
d_fchmod='define'
d_fchown='define'
d_fcntl='define'
d_fcntl_can_lock='define'
d_fd_macros='define'
d_fd_set='define'
d_fds_bits=''
d_fgetpos='define'
d_finite='define'
d_finitel='define'
d_flexfnam='define'
d_flock='define'
d_flockproto='define'
d_fork='define'
d_fp_class=''
d_fpathconf='define'
d_fpclass=''
d_fpclassify=''
d_fpclassl=''
d_fpos64_t=''
d_frexpl='define'
d_fs_data_s=''
d_fseeko='define'
d_fsetpos='define'
d_fstatfs='define'
d_fstatvfs='define'
d_fsync='define'
d_ftello='define'
d_ftime=''
d_getcwd='define'
d_getespwnam=''
d_getfsstat=''
d_getgrent='define'
d_getgrent_r=''
d_getgrgid_r=''
d_getgrnam_r=''
d_getgrps='define'
d_gethbyaddr='define'
d_gethbyname='define'
d_gethent='define'
d_gethname='define'
d_gethostbyaddr_r=''
d_gethostbyname_r=''
d_gethostent_r=''
d_gethostprotos='define'
d_getitimer='define'
d_getlogin='define'
d_getlogin_r=''
d_getmnt=''
d_getmntent='define'
d_getnbyaddr='define'
d_getnbyname='define'
d_getnent='define'
d_getnetbyaddr_r=''
d_getnetbyname_r=''
d_getnetent_r=''
d_getnetprotos='define'
d_getpagsz='define'
d_getpbyname='define'
d_getpbynumber='define'
d_getpent='define'
d_getpgid='define'
d_getpgrp='define'
d_getpgrp2=''
d_getppid='define'
d_getprior='define'
d_getprotobyname_r=''
d_getprotobynumber_r=''
d_getprotoent_r=''
d_getprotoprotos='define'
d_getprpwnam=''
d_getpwent='define'
d_getpwent_r=''
d_getpwnam_r=''
d_getpwuid_r=''
d_getsbyname='define'
d_getsbyport='define'
d_getsent='define'
d_getservbyname_r=''
d_getservbyport_r=''
d_getservent_r=''
d_getservprotos='define'
d_getspnam='define'
d_getspnam_r=''
d_gettimeod='define'
d_gmtime_r=''
d_gnulibc='define'
d_grpasswd='define'
d_hasmntopt='define'
d_htonl='define'
d_ilogbl='define'
d_index=''
d_inetaton='define'
d_int64_t='define'
d_isascii='define'
d_isfinite=''
d_isinf='define'
d_isnan='define'
d_isnanl='define'
d_killpg='define'
d_lchown='define'
d_ldbl_dig='define'
d_link='define'
d_localtime_r=''
d_locconv='define'
d_lockf='define'
d_longdbl='define'
d_longlong='define'
d_lseekproto='define'
d_lstat='define'
d_madvise='define'
d_mblen='define'
d_mbstowcs='define'
d_mbtowc='define'
d_memchr='define'
d_memcmp='define'
d_memcpy='define'
d_memmove='define'
d_memset='define'
d_mkdir='define'
d_mkdtemp='define'
d_mkfifo='define'
d_mkstemp='define'
d_mkstemps=''
d_mktime='define'
d_mmap='define'
d_modfl='define'
d_modfl_pow32_bug=''
d_modflproto=''
d_mprotect='define'
d_msg='define'
d_msg_ctrunc='define'
d_msg_dontroute='define'
d_msg_oob='define'
d_msg_peek='define'
d_msg_proxy='define'
d_msgctl='define'
d_msgget='define'
d_msghdr_s='define'
d_msgrcv='define'
d_msgsnd='define'
d_msync='define'
d_munmap='define'
d_mymalloc=''
d_nice='define'
d_nl_langinfo='define'
d_nv_preserves_uv='define'
d_off64_t=''
d_old_pthread_create_joinable=''
d_oldpthreads=''
d_oldsock=''
d_open3='define'
d_pathconf='define'
d_pause='define'
d_perl_otherlibdirs=''
d_phostname=''
d_pipe='define'
d_poll='define'
d_portable='define'
d_procselfexe='define'
d_pthread_atfork='define'
d_pthread_attr_setscope='define'
d_pthread_yield='define'
d_pwage=''
d_pwchange=''
d_pwclass=''
d_pwcomment=''
d_pwexpire=''
d_pwgecos='define'
d_pwpasswd='define'
d_pwquota=''
d_qgcvt='define'
d_quad='define'
d_random_r=''
d_readdir='define'
d_readdir64_r=''
d_readdir_r=''
d_readlink='define'
d_readv='define'
d_recvmsg='define'
d_rename='define'
d_rewinddir='define'
d_rmdir='define'
d_safebcpy=''
d_safemcpy=''
d_sanemcmp='define'
d_sbrkproto='define'
d_scalbnl='define'
d_sched_yield='define'
d_scm_rights='define'
d_seekdir='define'
d_select='define'
d_sem='define'
d_semctl='define'
d_semctl_semid_ds='define'
d_semctl_semun='define'
d_semget='define'
d_semop='define'
d_sendmsg='define'
d_setegid='define'
d_seteuid='define'
d_setgrent='define'
d_setgrent_r=''
d_setgrps='define'
d_sethent='define'
d_sethostent_r=''
d_setitimer='define'
d_setlinebuf='define'
d_setlocale='define'
d_setlocale_r=''
d_setnent='define'
d_setnetent_r=''
d_setpent='define'
d_setpgid='define'
d_setpgrp='define'
d_setpgrp2=''
d_setprior='define'
d_setproctitle=''
d_setprotoent_r=''
d_setpwent='define'
d_setpwent_r=''
d_setregid='define'
d_setresgid='define'
d_setresuid='define'
d_setreuid='define'
d_setrgid=''
d_setruid=''
d_setsent='define'
d_setservent_r=''
d_setsid='define'
d_setvbuf='define'
d_sfio=''
d_shm='define'
d_shmat='define'
d_shmatprototype='define'
d_shmctl='define'
d_shmdt='define'
d_shmget='define'
d_sigaction='define'
d_sigprocmask='define'
d_sigsetjmp='define'
d_sockatmark='define'
d_sockatmarkproto=''
d_socket='define'
d_socklen_t='define'
d_sockpair='define'
d_socks5_init=''
d_sqrtl='define'
d_srand48_r=''
d_srandom_r=''
d_sresgproto=''
d_sresuproto=''
d_statblks='define'
d_statfs_f_flags=''
d_statfs_s='define'
d_statvfs='define'
d_stdio_cnt_lval=''
d_stdio_ptr_lval=''
d_stdio_ptr_lval_nochange_cnt=''
d_stdio_ptr_lval_sets_cnt=''
d_stdio_stream_array=''
d_stdiobase=''
d_stdstdio=''
d_strchr='define'
d_strcoll='define'
d_strctcpy='define'
d_strerrm='strerror(e)'
d_strerror='define'
d_strerror_r=''
d_strftime='define'
d_strtod='define'
d_strtol='define'
d_strtold='define'
d_strtoll='define'
d_strtoq='define'
d_strtoul='define'
d_strtoull='define'
d_strtouq='define'
d_strxfrm='define'
d_suidsafe=''
d_symlink='define'
d_syscall='define'
d_syscallproto='define'
d_sysconf='define'
d_sysernlst=''
d_syserrlst='define'
d_system='define'
d_tcgetpgrp='define'
d_tcsetpgrp='define'
d_telldir='define'
d_telldirproto='define'
d_time='define'
d_times='define'
d_tm_tm_gmtoff='define'
d_tm_tm_zone='define'
d_tmpnam_r=''
d_truncate='define'
d_ttyname_r=''
d_tzname='define'
d_u32align=''
d_ualarm='define'
d_umask='define'
d_uname='define'
d_union_semun=''
d_unordered=''
d_usleep='define'
d_usleepproto='define'
d_ustat='define'
d_vendorarch='define'
d_vendorbin='define'
d_vendorlib='define'
d_vendorscript='define'
d_vfork=''
d_void_closedir=''
d_voidsig='define'
d_voidtty=''
d_volatile='define'
d_vprintf='define'
d_wait4='define'
d_waitpid='define'
d_wcstombs='define'
d_wctomb='define'
d_writev='define'
d_xenix=''
date='date'
db_hashtype='u_int32_t'
db_prefixtype='size_t'
db_version_major='4'
db_version_minor='1'
db_version_patch='25'
defvoidused='15'
direntrytype='struct dirent'
dlext='so'
dlsrc='dl_dlopen.xs'
doublesize='8'
drand01='drand48()'
drand48_r_proto='0'
dynamic_ext='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf
Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob
Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util
MIME/Base64 NDBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar
PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes
Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared'
eagain='EAGAIN'
ebcdic=''
echo='echo'
egrep='egrep'
emacs=''
endgrent_r_proto='0'
endhostent_r_proto='0'
endnetent_r_proto='0'
endprotoent_r_proto='0'
endpwent_r_proto='0'
endservent_r_proto='0'
eunicefix='​:'
exe_ext=''
expr='expr'
extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf
Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob
Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util
MIME/Base64 NDBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar
PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes
Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared
Errno'
extras=''
fflushNULL='define'
fflushall=''
find=''
firstmakefile='makefile'
flex=''
fpossize='16'
fpostype='fpos_t'
freetype='void'
from='​:'
full_ar='/usr/bin/ar'
full_csh='/bin/csh'
full_sed='/bin/sed'
gccansipedantic=''
gccosandvers=''
gccversion='3.3.3 20040217 (Gentoo Linux 3.3.3, propolice-3.3-7)'
getgrent_r_proto='0'
getgrgid_r_proto='0'
getgrnam_r_proto='0'
gethostbyaddr_r_proto='0'
gethostbyname_r_proto='0'
gethostent_r_proto='0'
getlogin_r_proto='0'
getnetbyaddr_r_proto='0'
getnetbyname_r_proto='0'
getnetent_r_proto='0'
getprotobyname_r_proto='0'
getprotobynumber_r_proto='0'
getprotoent_r_proto='0'
getpwent_r_proto='0'
getpwnam_r_proto='0'
getpwuid_r_proto='0'
getservbyname_r_proto='0'
getservbyport_r_proto='0'
getservent_r_proto='0'
getspnam_r_proto='0'
gidformat='"lu"'
gidsign='1'
gidsize='4'
gidtype='gid_t'
glibpth='/usr/shlib /lib /usr/lib /usr/lib/386 /lib/386 /usr/ccs/lib
/usr/ucblib /usr/local/lib '
gmake='gmake'
gmtime_r_proto='0'
gnulibc_version='2.3.3'
grep='grep'
groupcat='cat /etc/group'
groupstype='gid_t'
gzip='gzip'
h_fcntl='false'
h_sysfile='true'
hint='recommended'
hostcat='cat /etc/hosts'
html1dir=' '
html1direxp=''
html3dir=' '
html3direxp=''
i16size='2'
i16type='short'
i32size='4'
i32type='long'
i64size='8'
i64type='long long'
i8size='1'
i8type='char'
i_arpainet='define'
i_bsdioctl=''
i_crypt='define'
i_db='define'
i_dbm=''
i_dirent='define'
i_dld=''
i_dlfcn='define'
i_fcntl=''
i_float='define'
i_fp=''
i_fp_class=''
i_gdbm='define'
i_grp='define'
i_ieeefp=''
i_inttypes='define'
i_langinfo='define'
i_libutil=''
i_limits='define'
i_locale='define'
i_machcthr=''
i_malloc='define'
i_math='define'
i_memory=''
i_mntent='define'
i_ndbm='define'
i_netdb='define'
i_neterrno=''
i_netinettcp='define'
i_niin='define'
i_poll='define'
i_prot=''
i_pthread='define'
i_pwd='define'
i_rpcsvcdbm=''
i_sfio=''
i_sgtty=''
i_shadow='define'
i_socks=''
i_stdarg='define'
i_stddef='define'
i_stdlib='define'
i_string='define'
i_sunmath=''
i_sysaccess=''
i_sysdir='define'
i_sysfile='define'
i_sysfilio=''
i_sysin=''
i_sysioctl='define'
i_syslog='define'
i_sysmman='define'
i_sysmode=''
i_sysmount='define'
i_sysndir=''
i_sysparam='define'
i_sysresrc='define'
i_syssecrt=''
i_sysselct='define'
i_syssockio=''
i_sysstat='define'
i_sysstatfs='define'
i_sysstatvfs='define'
i_systime='define'
i_systimek=''
i_systimes='define'
i_systypes='define'
i_sysuio='define'
i_sysun='define'
i_sysutsname='define'
i_sysvfs='define'
i_syswait='define'
i_termio=''
i_termios='define'
i_time='define'
i_unistd='define'
i_ustat='define'
i_utime='define'
i_values='define'
i_varargs=''
i_varhdr='stdarg.h'
i_vfork=''
ignore_versioned_solibs='y'
inc_version_list='5.8.2 5.8.2/i686-linux 5.8.4 5.8.4/i686-linux 5.8.5
5.8.5/i686-linux '
inc_version_list_init='"5.8.2","5.8.2/i686-linux","5.8.4","5.8.4/i686-linux","5.8.5","5.8.5/i686-linux",0'
incpath=''
inews=''
installarchlib='/usr/lib/perl5/5.8.6/i686-linux'
installbin='/usr/bin'
installhtml1dir=''
installhtml3dir=''
installman1dir='/usr/share/man/man1'
installman3dir='/usr/share/man/man3'
installprefix='/usr'
installprefixexp='/usr'
installprivlib='/usr/lib/perl5/5.8.6'
installscript='/usr/bin'
installsitearch='/usr/lib/perl5/site_perl/5.8.6/i686-linux'
installsitebin='/usr/bin'
installsitehtml1dir=''
installsitehtml3dir=''
installsitelib='/usr/lib/perl5/site_perl/5.8.6'
installsiteman1dir='/usr/share/man/man1'
installsiteman3dir='/usr/share/man/man3'
installsitescript='/usr/bin'
installstyle='lib/perl5'
installusrbinperl=''
installvendorarch='/usr/lib/perl5/vendor_perl/5.8.6/i686-linux'
installvendorbin='/usr/bin'
installvendorhtml1dir=''
installvendorhtml3dir=''
installvendorlib='/usr/lib/perl5/vendor_perl/5.8.6'
installvendorman1dir='/usr/share/man/man1'
installvendorman3dir='/usr/share/man/man3'
installvendorscript='/usr/bin'
intsize='4'
issymlink='test -h'
ivdformat='"ld"'
ivsize='4'
ivtype='long'
known_extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf
Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob
Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util
MIME/Base64 NDBM_File ODBM_File Opcode POSIX PerlIO/encoding
PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname
Sys/Syslog Thread Time/HiRes Unicode/Normalize XS/APItest XS/Typemap
attrs re threads threads/shared'
ksh=''
ld='gcc'
lddlflags='-shared -L/usr/local/lib'
ldflags=' -L/usr/local/lib'
ldflags_uselargefiles=''
ldlibpthname='LD_LIBRARY_PATH'
less='less'
lib_ext='.a'
libc='/lib/libc-2.3.3.so'
libperl='libperl.a'
libpth='/usr/local/lib /lib /usr/lib'
libs='-lpthread -lnsl -lndbm -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc'
libsdirs=' /usr/lib'
libsfiles=' libpthread.so libnsl.so libndbm.so libgdbm.so libdb.so
libdl.so libm.so libcrypt.so libutil.so libc.so'
libsfound=' /usr/lib/libpthread.so /usr/lib/libnsl.so
/usr/lib/libndbm.so /usr/lib/libgdbm.so /usr/lib/libdb.so
/usr/lib/libdl.so /usr/lib/libm.so /usr/lib/libcrypt.so
/usr/lib/libutil.so /usr/lib/libc.so'
libspath=' /usr/local/lib /lib /usr/lib'
libswanted='pthread sfio socket bind inet nsl nm ndbm gdbm dbm db malloc
dl dld ld sun m crypt sec util c cposix posix ucb BSD'
libswanted_uselargefiles=''
line=''
lint=''
lkflags=''
ln='ln'
lns='/bin/ln -s'
localtime_r_proto='0'
locincpth=' '
loclibpth='/usr/local/lib /opt/local/lib /usr/gnu/lib /opt/gnu/lib
/usr/GNU/lib /opt/GNU/lib'
longdblsize='12'
longlongsize='8'
longsize='4'
lp=''
lpr=''
ls='ls'
lseeksize='8'
lseektype='off_t'
mail=''
mailx=''
make='make'
make_set_make='#'
mallocobj=''
mallocsrc=''
malloctype='void *'
man1dir='/usr/share/man/man1'
man1direxp='/usr/share/man/man1'
man1ext='1'
man3dir='/usr/share/man/man3'
man3direxp='/usr/share/man/man3'
man3ext='3pm'
mips_type=''
mistrustnm=''
mkdir='mkdir'
mmaptype='void *'
modetype='mode_t'
more='more'
multiarch=''
mv=''
myarchname='i686-linux'
mydomain='.med.usherbrooke.ca'
myhostname='denethor'
myuname='linux denethor 2.6.5-gentoo-r1 #1 fri may 28 17​:11​:18 edt 2004
i686 intel(r) pentium(r) 4 cpu 2.40ghz genuineintel gnulinux '
n='-n'
need_va_copy=''
netdb_hlen_type='size_t'
netdb_host_type='const void *'
netdb_name_type='const char *'
netdb_net_type='in_addr_t'
nm='nm'
nm_opt=''
nm_so_opt='--dynamic'
nonxs_ext='Errno'
nroff='nroff'
nvEUformat='"E"'
nvFUformat='"F"'
nvGUformat='"G"'
nv_preserves_uv_bits='32'
nveformat='"e"'
nvfformat='"f"'
nvgformat='"g"'
nvsize='8'
nvtype='double'
o_nonblock='O_NONBLOCK'
obj_ext='.o'
old_pthread_create_joinable=''
optimize='-O3 -march=pentium4 -fomit-frame-pointer -pipe'
orderlib='false'
osname='linux'
osvers='2.6.5-gentoo-r1'
otherlibdirs=' '
package='perl5'
pager='/usr/bin/less'
passcat='cat /etc/passwd'
patchlevel='8'
path_sep='​:'
perl=''
perl5='/usr/bin/perl'
perl_patchlevel=''
perladmin='Gentoo@​denethor.med.usherbrooke.ca'
perllibs='-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc'
perlpath='/usr/bin/perl'
pg='pg'
phostname='hostname'
pidtype='pid_t'
plibpth=''
pmake=''
pr=''
prefix='/usr'
prefixexp='/usr'
privlib='/usr/lib/perl5/5.8.6'
privlibexp='/usr/lib/perl5/5.8.6'
procselfexe='"/proc/self/exe"'
prototype='define'
ptrsize='4'
quadkind='3'
quadtype='long long'
randbits='48'
randfunc='drand48'
random_r_proto='0'
randseedtype='long'
ranlib='​:'
rd_nodata='-1'
readdir64_r_proto='0'
readdir_r_proto='0'
revision='5'
rm='rm'
rmail=''
run=''
runnm='false'
sPRIEUldbl='"LE"'
sPRIFUldbl='"LF"'
sPRIGUldbl='"LG"'
sPRIXU64='"LX"'
sPRId64='"Ld"'
sPRIeldbl='"Le"'
sPRIfldbl='"Lf"'
sPRIgldbl='"Lg"'
sPRIi64='"Li"'
sPRIo64='"Lo"'
sPRIu64='"Lu"'
sPRIx64='"Lx"'
sSCNfldbl='"Lf"'
sched_yield='sched_yield()'
scriptdir='/usr/bin'
scriptdirexp='/usr/bin'
sed='sed'
seedfunc='srand48'
selectminbits='32'
selecttype='fd_set *'
sendmail=''
setgrent_r_proto='0'
sethostent_r_proto='0'
setlocale_r_proto='0'
setnetent_r_proto='0'
setprotoent_r_proto='0'
setpwent_r_proto='0'
setservent_r_proto='0'
sh='/bin/sh'
shar=''
sharpbang='#!'
shmattype='void *'
shortsize='2'
shrpenv=''
shsharp='true'
sig_count='65'
sig_name='ZERO HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2
PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM
PROF WINCH IO PWR SYS NUM32 NUM33 NUM34 RTMIN NUM36 NUM37 NUM38 NUM39
NUM40 NUM41 NUM42 NUM43 NUM44 NUM45 NUM46 NUM47 NUM48 NUM49 NUM50 NUM51
NUM52 NUM53 NUM54 NUM55 NUM56 NUM57 NUM58 NUM59 NUM60 NUM61 NUM62 NUM63
RTMAX IOT CLD POLL UNUSED '
sig_name_init='"ZERO", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT",
"BUS", "FPE", "KILL", "USR1", "SEGV", "USR2", "PIPE", "ALRM", "TERM",
"STKFLT", "CHLD", "CONT", "STOP", "TSTP", "TTIN", "TTOU", "URG", "XCPU",
"XFSZ", "VTALRM", "PROF", "WINCH", "IO", "PWR", "SYS", "NUM32", "NUM33",
"NUM34", "RTMIN", "NUM36", "NUM37", "NUM38", "NUM39", "NUM40", "NUM41",
"NUM42", "NUM43", "NUM44", "NUM45", "NUM46", "NUM47", "NUM48", "NUM49",
"NUM50", "NUM51", "NUM52", "NUM53", "NUM54", "NUM55", "NUM56", "NUM57",
"NUM58", "NUM59", "NUM60", "NUM61", "NUM62", "NUM63", "RTMAX", "IOT",
"CLD", "POLL", "UNUSED", 0'
sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 6 17 29 31 '
sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 6, 17, 29, 31, 0'
sig_size='69'
signal_t='void'
sitearch='/usr/lib/perl5/site_perl/5.8.6/i686-linux'
sitearchexp='/usr/lib/perl5/site_perl/5.8.6/i686-linux'
sitebin='/usr/bin'
sitebinexp='/usr/bin'
sitehtml1dir=''
sitehtml1direxp=''
sitehtml3dir=''
sitehtml3direxp=''
sitelib='/usr/lib/perl5/site_perl/5.8.6'
sitelib_stem='/usr/lib/perl5/site_perl'
sitelibexp='/usr/lib/perl5/site_perl/5.8.6'
siteman1dir='/usr/share/man/man1'
siteman1direxp='/usr/share/man/man1'
siteman3dir='/usr/share/man/man3'
siteman3direxp='/usr/share/man/man3'
siteprefix='/usr'
siteprefixexp='/usr'
sitescript='/usr/bin'
sitescriptexp='/usr/bin'
sizesize='4'
sizetype='size_t'
sleep=''
smail=''
so='so'
sockethdr=''
socketlib=''
socksizetype='socklen_t'
sort='sort'
spackage='Perl5'
spitshell='cat'
srand48_r_proto='0'
srandom_r_proto='0'
src='.'
ssizetype='ssize_t'
startperl='#!/usr/bin/perl'
startsh='#!/bin/sh'
static_ext=' '
stdchar='char'
stdio_base='((fp)->_IO_read_base)'
stdio_bufsiz='((fp)->_IO_read_end - (fp)->_IO_read_base)'
stdio_cnt='((fp)->_IO_read_end - (fp)->_IO_read_ptr)'
stdio_filbuf=''
stdio_ptr='((fp)->_IO_read_ptr)'
stdio_stream_array=''
strerror_r_proto='0'
strings='/usr/include/string.h'
submit=''
subversion='6'
sysman='/usr/share/man/man1'
tail=''
tar=''
targetarch=''
tbl=''
tee=''
test='test'
timeincl='/usr/include/sys/time.h /usr/include/time.h '
timetype='time_t'
tmpnam_r_proto='0'
to='​:'
touch='touch'
tr='tr'
trnl='\n'
troff=''
ttyname_r_proto='0'
u16size='2'
u16type='unsigned short'
u32size='4'
u32type='unsigned long'
u64size='8'
u64type='unsigned long long'
u8size='1'
u8type='unsigned char'
uidformat='"lu"'
uidsign='1'
uidsize='4'
uidtype='uid_t'
uname='uname'
uniq='uniq'
uquadtype='unsigned long long'
use5005threads=''
use64bitall=''
use64bitint=''
usecrosscompile=''
usedl='define'
usefaststdio='define'
useithreads=''
uselargefiles='define'
uselongdouble=''
usemallocwrap='define'
usemorebits=''
usemultiplicity=''
usemymalloc='n'
usenm='false'
useopcode='true'
useperlio='define'
useposix='true'
usereentrant=''
usesfio='false'
useshrplib='false'
usesocks=''
usethreads=''
usevendorprefix='define'
usevfork='false'
usrinc='/usr/include'
uuname=''
uvXUformat='"lX"'
uvoformat='"lo"'
uvsize='4'
uvtype='unsigned long'
uvuformat='"lu"'
uvxformat='"lx"'
vendorarch='/usr/lib/perl5/vendor_perl/5.8.6/i686-linux'
vendorarchexp='/usr/lib/perl5/vendor_perl/5.8.6/i686-linux'
vendorbin='/usr/bin'
vendorbinexp='/usr/bin'
vendorhtml1dir=' '
vendorhtml1direxp=''
vendorhtml3dir=' '
vendorhtml3direxp=''
vendorlib='/usr/lib/perl5/vendor_perl/5.8.6'
vendorlib_stem='/usr/lib/perl5/vendor_perl'
vendorlibexp='/usr/lib/perl5/vendor_perl/5.8.6'
vendorman1dir='/usr/share/man/man1'
vendorman1direxp='/usr/share/man/man1'
vendorman3dir='/usr/share/man/man3'
vendorman3direxp='/usr/share/man/man3'
vendorprefix='/usr'
vendorprefixexp='/usr'
vendorscript='/usr/bin'
vendorscriptexp='/usr/bin'
version='5.8.6'
version_patchlevel_string='version 8 subversion 6'
versiononly=''
vi=''
voidflags='15'
xlibpth='/usr/lib/386 /lib/386'
yacc='yacc'
yaccflags='-DPERL5 '
zcat=''
zip='zip'

@p5pRT
Copy link
Author

p5pRT commented Jul 20, 2005

From @iabyn

On Mon, Mar 21, 2005 at 08​:42​:11PM -0000, philippe. cote @​ usherbrooke. ca wrote​:

sv_rvweaken doesn't handle tied variables

Proof :

+-------------------------------------------------------------------------+
Sample code
+-------------------------------------------------------------------------+
#!/usr/bin/perl
use strict;
use warnings;
use Util​::Monitor;

use Scalar​::Util qw(weaken);
use Devel​::Peek;
{
my (@​a);
$a[0] = \@​a;
#tie @​a, 'TestArray';
Dump($a[0],1);
weaken($a[0]);
Dump($a[0],1);
print "Leaving scope\n";
}
print "Scope left\n";

package TestArray;
use Tie​::Array;
use base 'Tie​::StdArray';

sub DESTROY { print "Monitor​::TestArray​::DESTROY : $_[0]\n"; }

I'm not really sure what you expect the effect of weakening a tied array
element should be. I suspect that in the general case doing this makes no
sense.

1;

+-------------------------------------------------------------------------+
Output without "tie @​a, 'TestArray'"
(Just to show you that weaken works without the tie)
+-------------------------------------------------------------------------+
SV = RV(0x81829c0) at 0x814127c
REFCNT = 1
FLAGS = (ROK)
RV = 0x814e740
SV = PVAV(0x81426cc) at 0x814e740
REFCNT = 2
FLAGS = (PADBUSY,PADMY)
IV = 0
NV = 0
ARRAY = 0x8148888
FILL = 0
MAX = 3
ARYLEN = 0x0
FLAGS = (REAL)
SV = RV(0x81829c0) at 0x814127c
REFCNT = 1
FLAGS = (ROK,WEAKREF,IsUV)
RV = 0x814e740
SV = PVAV(0x81426cc) at 0x814e740
REFCNT = 1
FLAGS = (PADBUSY,PADMY,RMG)
IV = 0
NV = 0
MAGIC = 0x8266f08
MG_VIRTUAL = &PL_vtbl_backref
MG_TYPE = PERL_MAGIC_backref(<)
MG_FLAGS = 0x02
REFCOUNTED
MG_OBJ = 0x81411c8
SV = PVAV(0x8263704) at 0x81411c8
REFCNT = 2
FLAGS = ()
IV = 0
NV = 0
ARRAY = 0x82677e8
FILL = 0
MAX = 3
ARYLEN = 0x0
FLAGS = (REAL)
ARRAY = 0x8148888
FILL = 0
MAX = 3
ARYLEN = 0x0
FLAGS = (REAL)
Leaving scope
Scope left

+-------------------------------------------------------------------------+
Output with "tie @​a, 'TestArray';"
+-------------------------------------------------------------------------+
SV = PVLV(0x817c568) at 0x81413f0
REFCNT = 1
FLAGS = (TEMP,GMG,SMG,RMG)
IV = 0
NV = 0
PV = 0
MAGIC = 0x81505b8
MG_VIRTUAL = &PL_vtbl_packelem
MG_TYPE = PERL_MAGIC_tiedelem(p)
MG_FLAGS = 0x02
REFCOUNTED
MG_OBJ = 0x814139c
SV = RV(0x81829ac) at 0x814139c
REFCNT = 2
FLAGS = (ROK)
RV = 0x8141354
TYPE = t
TARGOFF = 0
TARGLEN = 0
TARG = 0x81413f0
SV = PVLV(0x817c568) at 0x81413f0
REFCNT = 1
FLAGS = (TEMP,GMG,SMG,RMG)
IV = 0
NV = 0
PV = 0
MAGIC = 0x81505b8
MG_VIRTUAL = &PL_vtbl_packelem
MG_TYPE = PERL_MAGIC_tiedelem(p)
MG_FLAGS = 0x02
REFCOUNTED
MG_OBJ = 0x814139c
SV = RV(0x81829ac) at 0x814139c
REFCNT = 2
FLAGS = (ROK)
RV = 0x8141354
TYPE = t
TARGOFF = 0
TARGLEN = 0
TARG = 0x81413f0
Leaving scope
Scope left
Monitor​::TestArray​::DESTROY : TestArray=ARRAY(0x8141354)

+-------------------------------------------------------------------------+
Explanations
+-------------------------------------------------------------------------+
We see that weaken is not applied on a tied variable. I've been
searching in source code and calls goes like this :

Scalar​::Util​::weaken -> sv_rvweaken -> Perl_sv_rvweaken

+-------------------------------------------------------------------------+
Scalar​::Util​::weaken source code
+-------------------------------------------------------------------------+
void
weaken(sv)
SV *sv
PROTOTYPE​: $
CODE​:
#ifdef SvWEAKREF
sv_rvweaken(sv);
#else
croak("weak references are not implemented in this release of perl");
#endif

We see clearly that it only calls sv_rvweaken from the perl source code.
So this method doesn't contain bugs.
We also finds that sv_rvweaken is associated to Perl_sv_rvweaken as
defined by embed.h
Let's look at this code

+-------------------------------------------------------------------------+
Perl_sv_rvweaken source code from sv.c
+-------------------------------------------------------------------------+
/*
=for apidoc sv_rvweaken

Weaken a reference​: set the C<SvWEAKREF> flag on this RV; give the
referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
push a back-reference to this RV onto the array of backreferences
associated with that magic.

=cut
*/

SV *
Perl_sv_rvweaken(pTHX_ SV *sv)
{
SV *tsv;
if (!SvOK(sv)) /* let undefs pass */
return sv;
if (!SvROK(sv))
Perl_croak(aTHX_ "Can't weaken a nonreference");
else if (SvWEAKREF(sv)) {
if (ckWARN(WARN_MISC))
Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is
already weak");
return sv;
}
tsv = SvRV(sv);
sv_add_backref(tsv, sv);
SvWEAKREF_on(sv);
SvREFCNT_dec(tsv);
return sv;
}

+-------------------------------------------------------------------------+
Conclusion
+-------------------------------------------------------------------------+
The bug is in Perl_sv_rvweaken there :
if (!SvOK(sv)) /* let undefs pass */
return sv;
This code should be modified like this :
if (!SvOK(sv)) /* undef var or tied object or something else */
if (SvMAGIC(sv)) {
//********************************************/
//********************************************/
//********************************************/
//APPLY WEAKEN HERE (Which I don't know how)
//********************************************/
//********************************************/
//********************************************/
} else {
return sv;
}
}

Thank you

Philippe Cote
Centre de genomique fonctionnelle du Canada

---
Flags​:
category=core
severity=high
---
Site configuration information for perl v5.8.6​:

Configured by Gentoo at Mon Feb 28 13​:17​:43 EST 2005.

Summary of my perl5 (revision 5 version 8 subversion 6) configuration​:
Platform​:
osname=linux, osvers=2.6.5-gentoo-r1, archname=i686-linux
uname='linux denethor 2.6.5-gentoo-r1 #1 fri may 28 17​:11​:18 edt
2004 i686 intel(r) pentium(r) 4 cpu 2.40ghz genuineintel gnulinux '
config_args='-des -Darchname=i686-linux -Dcccdlflags=-fPIC
-Dccdlflags=-rdynamic -Dcc=gcc -Dprefix=/usr -Dvendorprefix=/usr
-Dsiteprefix=/usr -Dlocincpth= -Doptimize=-O3 -march=pentium4
-fomit-frame-pointer -pipe -Duselargefiles -Dd_semctl_semun
-Dscriptdir=/usr/bin -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dinstallman1dir=/usr/share/man/man1
-Dinstallman3dir=/var/tmp/portage/perl-5.8.6-r2/image//usr/share/man/man3
-Dman1ext=1 -Dman3ext=3pm -Dinc_version_list=5.8.2 5.8.2/i686-linux
5.8.4 5.8.4/i686-linux 5.8.5 5.8.5/i686-linux -Dcf_by=Gentoo -Ud_csh
-Di_ndbm -Di_gdbm -Di_db'
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=undef
usemymalloc=n, bincompat5005=undef
Compiler​:
cc='gcc', ccflags ='-fno-strict-aliasing -pipe -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64',
optimize='-O3 -march=pentium4 -fomit-frame-pointer -pipe',
cppflags='-DPERL5 -fno-strict-aliasing -pipe'
ccversion='', gccversion='3.3.3 20040217 (Gentoo Linux 3.3.3,
propolice-3.3-7)', 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='double', nvsize=8, Off_t='off_t',
lseeksize=8
alignbytes=4, prototype=define
Linker and Libraries​:
ld='gcc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lpthread -lnsl -lndbm -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc
perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
libc=/lib/libc-2.3.3.so, so=so, useshrplib=false, libperl=libperl.a
gnulibc_version='2.3.3'
Dynamic Linking​:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic'
cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'

Locally applied patches​:

---
@​INC for perl v5.8.6​:
/usr/local/inHousePerlLib
/var/www/localhost/webapps
/usr/local/inHousePerlLib/monadb/modules
/var/www/localhost/webapps
/usr/local/inHousePerlLib/OOSGD/modules/
/usr/local/inHousePerlLib/monadb/modules/
/usr/local/inHousePerlLib/ensembl/modules
/usr/local/inHousePerlLib
/etc/perl
/usr/lib/perl5/site_perl/5.8.6/i686-linux
/usr/lib/perl5/site_perl/5.8.6
/usr/lib/perl5/site_perl/5.8.2
/usr/lib/perl5/site_perl/5.8.2/i686-linux
/usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.6/i686-linux
/usr/lib/perl5/vendor_perl/5.8.6
/usr/lib/perl5/vendor_perl/5.8.2
/usr/lib/perl5/vendor_perl/5.8.2/i686-linux
/usr/lib/perl5/vendor_perl
/usr/lib/perl5/5.8.6/i686-linux
/usr/lib/perl5/5.8.6
/usr/local/lib/site_perl
/usr/lib/perl5/site_perl/5.8.2
/usr/lib/perl5/site_perl/5.8.2/i686-linux
.

---
Environment for perl v5.8.6​:
HOME=/home/philippe
LANG (unset)
LANGUAGE (unset)
LD_LIBRARY_PATH (unset)
LOGDIR (unset)

PATH=/usr/kde/3.2/bin​:/bin​:/usr/bin​:/usr/local/bin​:/opt/bin​:/usr/i686-pc-linux-gnu/gcc-bin/3.3​:/opt/Acrobat5​:/usr/X11R6/bin​:/opt/blackdown-jdk-1.4.1/bin​:/opt/blackdown-jdk-1.4.1/jre/bin​:/usr/qt/3/bin​:/usr/kde/3.1/bin

PERL5LIB=/usr/local/inHousePerlLib​:/var/www/localhost/webapps​:/usr/local/inHousePerlLib/monadb/modules​:/var/www/localhost/webapps​:/usr/local/inHousePerlLib/OOSGD/modules/​:/usr/local/inHousePerlLib/monadb/modules/​:/usr/local/inHousePerlLib/ensembl/modules​:/usr/local/inHousePerlLib
PERL_BADLANG (unset)
SHELL=/bin/zsh

Complete configuration data for perl v5.8.6​:

Author=''
CONFIG='true'
Date='$Date'
Header=''
Id='$Id'
Locker=''
Log='$Log'
Mcc='Mcc'
PATCHLEVEL='8'
PERL_API_REVISION='5'
PERL_API_SUBVERSION='0'
PERL_API_VERSION='8'
PERL_CONFIG_SH='true'
PERL_REVISION='5'
PERL_SUBVERSION='6'
PERL_VERSION='8'
RCSfile='$RCSfile'
Revision='$Revision'
SUBVERSION='6'
Source=''
State=''
_a='.a'
_exe=''
_o='.o'
afs='false'
afsroot='/afs'
alignbytes='4'
ansi2knr=''
aphostname='/bin/hostname'
api_revision='5'
api_subversion='0'
api_version='8'
api_versionstring='5.8.0'
ar='ar'
archlib='/usr/lib/perl5/5.8.6/i686-linux'
archlibexp='/usr/lib/perl5/5.8.6/i686-linux'
archname='i686-linux'
archname64=''
archobjs=''
asctime_r_proto='0'
awk='awk'
baserev='5.0'
bash=''
bin='/usr/bin'
binexp='/usr/bin'
bison='bison'
byacc='byacc'
byteorder='1234'
c=''
castflags='0'
cat='cat'
cc='gcc'
cccdlflags='-fPIC'
ccdlflags='-rdynamic'
ccflags='-fno-strict-aliasing -pipe -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64'
ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
ccname='gcc'
ccsymbols='__GNUC_MINOR__=3 __GNUC_PATCHLEVEL__=3'
ccversion=''
cf_by='Gentoo'
cf_email='Gentoo@​denethor.med.usherbrooke.ca'
cf_time='Mon Feb 28 13​:17​:43 EST 2005'
charsize='1'
chgrp=''
chmod='chmod'
chown=''
clocktype='clock_t'
comm='comm'
compress=''
config_arg0='Configure'
config_arg1='-des'
config_arg10='-Doptimize=-O3 -march=pentium4 -fomit-frame-pointer -pipe'
config_arg11='-Duselargefiles'
config_arg12='-Dd_semctl_semun'
config_arg13='-Dscriptdir=/usr/bin'
config_arg14='-Dman1dir=/usr/share/man/man1'
config_arg15='-Dman3dir=/usr/share/man/man3'
config_arg16='-Dinstallman1dir=/usr/share/man/man1'
config_arg17='-Dinstallman3dir=/usr/share/man/man3'
config_arg18='-Dman1ext=1'
config_arg19='-Dman3ext=3pm'
config_arg2='-Darchname=i686-linux'
config_arg20='-Dinc_version_list=5.8.2 5.8.2/i686-linux 5.8.4
5.8.4/i686-linux 5.8.5 5.8.5/i686-linux '
config_arg21='-Dcf_by=Gentoo'
config_arg22='-Ud_csh'
config_arg23='-Di_ndbm'
config_arg24='-Di_gdbm'
config_arg25='-Di_db'
config_arg3='-Dcccdlflags=-fPIC'
config_arg4='-Dccdlflags=-rdynamic'
config_arg5='-Dcc=gcc'
config_arg6='-Dprefix=/usr'
config_arg7='-Dvendorprefix=/usr'
config_arg8='-Dsiteprefix=/usr'
config_arg9='-Dlocincpth= '
config_argc='25'
config_args='-des -Darchname=i686-linux -Dcccdlflags=-fPIC
-Dccdlflags=-rdynamic -Dcc=gcc -Dprefix=/usr -Dvendorprefix=/usr
-Dsiteprefix=/usr -Dlocincpth= -Doptimize=-O3 -march=pentium4
-fomit-frame-pointer -pipe -Duselargefiles -Dd_semctl_semun
-Dscriptdir=/usr/bin -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dinstallman1dir=/usr/share/man/man1
-Dinstallman3dir=/var/tmp/portage/perl-5.8.6-r2/image//usr/share/man/man3
-Dman1ext=1 -Dman3ext=3pm -Dinc_version_list=5.8.2 5.8.2/i686-linux
5.8.4 5.8.4/i686-linux 5.8.5 5.8.5/i686-linux -Dcf_by=Gentoo -Ud_csh
-Di_ndbm -Di_gdbm -Di_db'
contains='grep'
cp='cp'
cpio=''
cpp='cpp'
cpp_stuff='42'
cppccsymbols='__GNUC__=3'
cppflags='-fno-strict-aliasing -pipe'
cpplast='-'
cppminus='-'
cpprun='gcc -E'
cppstdin='gcc -E'
cppsymbols='__ELF__=1 _FILE_OFFSET_BITS=64 __GLIBC__=2 __GLIBC_MINOR__=3
__GNUC_MINOR__=3 __GNU_LIBRARY__=6 _LARGEFILE_SOURCE=1
_POSIX_C_SOURCE=199506 _POSIX_SOURCE=1 __STDC__=1 __USE_BSD=1
__USE_FILE_OFFSET64=1 __USE_LARGEFILE=1 __USE_MISC=1 __USE_POSIX=1
__USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USE_SVID=1
i386=1 __i386=1 __i386__=1 linux=1 __linux=1 __linux__=1 unix=1 __unix=1
__unix__=1'
crypt_r_proto='0'
cryptlib=''
csh='csh'
ctermid_r_proto='0'
ctime_r_proto='0'
d_Gconvert='gcvt((x),(n),(b))'
d_PRIEUldbl='define'
d_PRIFUldbl='define'
d_PRIGUldbl='define'
d_PRIXU64='define'
d_PRId64='define'
d_PRIeldbl='define'
d_PRIfldbl='define'
d_PRIgldbl='define'
d_PRIi64='define'
d_PRIo64='define'
d_PRIu64='define'
d_PRIx64='define'
d_SCNfldbl='define'
d__fwalk=''
d_access='define'
d_accessx=''
d_aintl=''
d_alarm='define'
d_archlib='define'
d_asctime_r=''
d_atolf=''
d_atoll='define'
d_attribut='define'
d_bcmp='define'
d_bcopy='define'
d_bsd=''
d_bsdgetpgrp=''
d_bsdsetpgrp=''
d_bzero='define'
d_casti32=''
d_castneg='define'
d_charvspr='define'
d_chown='define'
d_chroot='define'
d_chsize=''
d_class=''
d_closedir='define'
d_cmsghdr_s='define'
d_const='define'
d_copysignl='define'
d_crypt='define'
d_crypt_r=''
d_csh=''
d_ctermid_r=''
d_ctime_r=''
d_cuserid='define'
d_dbl_dig='define'
d_dbminitproto=''
d_difftime='define'
d_dirfd='define'
d_dirnamlen=''
d_dlerror='define'
d_dlopen='define'
d_dlsymun=''
d_dosuid=''
d_drand48_r=''
d_drand48proto='define'
d_dup2='define'
d_eaccess=''
d_endgrent='define'
d_endgrent_r=''
d_endhent='define'
d_endhostent_r=''
d_endnent='define'
d_endnetent_r=''
d_endpent='define'
d_endprotoent_r=''
d_endpwent='define'
d_endpwent_r=''
d_endsent='define'
d_endservent_r=''
d_eofnblk='define'
d_eunice=''
d_faststdio=''
d_fchdir='define'
d_fchmod='define'
d_fchown='define'
d_fcntl='define'
d_fcntl_can_lock='define'
d_fd_macros='define'
d_fd_set='define'
d_fds_bits=''
d_fgetpos='define'
d_finite='define'
d_finitel='define'
d_flexfnam='define'
d_flock='define'
d_flockproto='define'
d_fork='define'
d_fp_class=''
d_fpathconf='define'
d_fpclass=''
d_fpclassify=''
d_fpclassl=''
d_fpos64_t=''
d_frexpl='define'
d_fs_data_s=''
d_fseeko='define'
d_fsetpos='define'
d_fstatfs='define'
d_fstatvfs='define'
d_fsync='define'
d_ftello='define'
d_ftime=''
d_getcwd='define'
d_getespwnam=''
d_getfsstat=''
d_getgrent='define'
d_getgrent_r=''
d_getgrgid_r=''
d_getgrnam_r=''
d_getgrps='define'
d_gethbyaddr='define'
d_gethbyname='define'
d_gethent='define'
d_gethname='define'
d_gethostbyaddr_r=''
d_gethostbyname_r=''
d_gethostent_r=''
d_gethostprotos='define'
d_getitimer='define'
d_getlogin='define'
d_getlogin_r=''
d_getmnt=''
d_getmntent='define'
d_getnbyaddr='define'
d_getnbyname='define'
d_getnent='define'
d_getnetbyaddr_r=''
d_getnetbyname_r=''
d_getnetent_r=''
d_getnetprotos='define'
d_getpagsz='define'
d_getpbyname='define'
d_getpbynumber='define'
d_getpent='define'
d_getpgid='define'
d_getpgrp='define'
d_getpgrp2=''
d_getppid='define'
d_getprior='define'
d_getprotobyname_r=''
d_getprotobynumber_r=''
d_getprotoent_r=''
d_getprotoprotos='define'
d_getprpwnam=''
d_getpwent='define'
d_getpwent_r=''
d_getpwnam_r=''
d_getpwuid_r=''
d_getsbyname='define'
d_getsbyport='define'
d_getsent='define'
d_getservbyname_r=''
d_getservbyport_r=''
d_getservent_r=''
d_getservprotos='define'
d_getspnam='define'
d_getspnam_r=''
d_gettimeod='define'
d_gmtime_r=''
d_gnulibc='define'
d_grpasswd='define'
d_hasmntopt='define'
d_htonl='define'
d_ilogbl='define'
d_index=''
d_inetaton='define'
d_int64_t='define'
d_isascii='define'
d_isfinite=''
d_isinf='define'
d_isnan='define'
d_isnanl='define'
d_killpg='define'
d_lchown='define'
d_ldbl_dig='define'
d_link='define'
d_localtime_r=''
d_locconv='define'
d_lockf='define'
d_longdbl='define'
d_longlong='define'
d_lseekproto='define'
d_lstat='define'
d_madvise='define'
d_mblen='define'
d_mbstowcs='define'
d_mbtowc='define'
d_memchr='define'
d_memcmp='define'
d_memcpy='define'
d_memmove='define'
d_memset='define'
d_mkdir='define'
d_mkdtemp='define'
d_mkfifo='define'
d_mkstemp='define'
d_mkstemps=''
d_mktime='define'
d_mmap='define'
d_modfl='define'
d_modfl_pow32_bug=''
d_modflproto=''
d_mprotect='define'
d_msg='define'
d_msg_ctrunc='define'
d_msg_dontroute='define'
d_msg_oob='define'
d_msg_peek='define'
d_msg_proxy='define'
d_msgctl='define'
d_msgget='define'
d_msghdr_s='define'
d_msgrcv='define'
d_msgsnd='define'
d_msync='define'
d_munmap='define'
d_mymalloc=''
d_nice='define'
d_nl_langinfo='define'
d_nv_preserves_uv='define'
d_off64_t=''
d_old_pthread_create_joinable=''
d_oldpthreads=''
d_oldsock=''
d_open3='define'
d_pathconf='define'
d_pause='define'
d_perl_otherlibdirs=''
d_phostname=''
d_pipe='define'
d_poll='define'
d_portable='define'
d_procselfexe='define'
d_pthread_atfork='define'
d_pthread_attr_setscope='define'
d_pthread_yield='define'
d_pwage=''
d_pwchange=''
d_pwclass=''
d_pwcomment=''
d_pwexpire=''
d_pwgecos='define'
d_pwpasswd='define'
d_pwquota=''
d_qgcvt='define'
d_quad='define'
d_random_r=''
d_readdir='define'
d_readdir64_r=''
d_readdir_r=''
d_readlink='define'
d_readv='define'
d_recvmsg='define'
d_rename='define'
d_rewinddir='define'
d_rmdir='define'
d_safebcpy=''
d_safemcpy=''
d_sanemcmp='define'
d_sbrkproto='define'
d_scalbnl='define'
d_sched_yield='define'
d_scm_rights='define'
d_seekdir='define'
d_select='define'
d_sem='define'
d_semctl='define'
d_semctl_semid_ds='define'
d_semctl_semun='define'
d_semget='define'
d_semop='define'
d_sendmsg='define'
d_setegid='define'
d_seteuid='define'
d_setgrent='define'
d_setgrent_r=''
d_setgrps='define'
d_sethent='define'
d_sethostent_r=''
d_setitimer='define'
d_setlinebuf='define'
d_setlocale='define'
d_setlocale_r=''
d_setnent='define'
d_setnetent_r=''
d_setpent='define'
d_setpgid='define'
d_setpgrp='define'
d_setpgrp2=''
d_setprior='define'
d_setproctitle=''
d_setprotoent_r=''
d_setpwent='define'
d_setpwent_r=''
d_setregid='define'
d_setresgid='define'
d_setresuid='define'
d_setreuid='define'
d_setrgid=''
d_setruid=''
d_setsent='define'
d_setservent_r=''
d_setsid='define'
d_setvbuf='define'
d_sfio=''
d_shm='define'
d_shmat='define'
d_shmatprototype='define'
d_shmctl='define'
d_shmdt='define'
d_shmget='define'
d_sigaction='define'
d_sigprocmask='define'
d_sigsetjmp='define'
d_sockatmark='define'
d_sockatmarkproto=''
d_socket='define'
d_socklen_t='define'
d_sockpair='define'
d_socks5_init=''
d_sqrtl='define'
d_srand48_r=''
d_srandom_r=''
d_sresgproto=''
d_sresuproto=''
d_statblks='define'
d_statfs_f_flags=''
d_statfs_s='define'
d_statvfs='define'
d_stdio_cnt_lval=''
d_stdio_ptr_lval=''
d_stdio_ptr_lval_nochange_cnt=''
d_stdio_ptr_lval_sets_cnt=''
d_stdio_stream_array=''
d_stdiobase=''
d_stdstdio=''
d_strchr='define'
d_strcoll='define'
d_strctcpy='define'
d_strerrm='strerror(e)'
d_strerror='define'
d_strerror_r=''
d_strftime='define'
d_strtod='define'
d_strtol='define'
d_strtold='define'
d_strtoll='define'
d_strtoq='define'
d_strtoul='define'
d_strtoull='define'
d_strtouq='define'
d_strxfrm='define'
d_suidsafe=''
d_symlink='define'
d_syscall='define'
d_syscallproto='define'
d_sysconf='define'
d_sysernlst=''
d_syserrlst='define'
d_system='define'
d_tcgetpgrp='define'
d_tcsetpgrp='define'
d_telldir='define'
d_telldirproto='define'
d_time='define'
d_times='define'
d_tm_tm_gmtoff='define'
d_tm_tm_zone='define'
d_tmpnam_r=''
d_truncate='define'
d_ttyname_r=''
d_tzname='define'
d_u32align=''
d_ualarm='define'
d_umask='define'
d_uname='define'
d_union_semun=''
d_unordered=''
d_usleep='define'
d_usleepproto='define'
d_ustat='define'
d_vendorarch='define'
d_vendorbin='define'
d_vendorlib='define'
d_vendorscript='define'
d_vfork=''
d_void_closedir=''
d_voidsig='define'
d_voidtty=''
d_volatile='define'
d_vprintf='define'
d_wait4='define'
d_waitpid='define'
d_wcstombs='define'
d_wctomb='define'
d_writev='define'
d_xenix=''
date='date'
db_hashtype='u_int32_t'
db_prefixtype='size_t'
db_version_major='4'
db_version_minor='1'
db_version_patch='25'
defvoidused='15'
direntrytype='struct dirent'
dlext='so'
dlsrc='dl_dlopen.xs'
doublesize='8'
drand01='drand48()'
drand48_r_proto='0'
dynamic_ext='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf
Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob
Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util
MIME/Base64 NDBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar
PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes
Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared'
eagain='EAGAIN'
ebcdic=''
echo='echo'
egrep='egrep'
emacs=''
endgrent_r_proto='0'
endhostent_r_proto='0'
endnetent_r_proto='0'
endprotoent_r_proto='0'
endpwent_r_proto='0'
endservent_r_proto='0'
eunicefix='​:'
exe_ext=''
expr='expr'
extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf
Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob
Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util
MIME/Base64 NDBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar
PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes
Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared
Errno'
extras=''
fflushNULL='define'
fflushall=''
find=''
firstmakefile='makefile'
flex=''
fpossize='16'
fpostype='fpos_t'
freetype='void'
from='​:'
full_ar='/usr/bin/ar'
full_csh='/bin/csh'
full_sed='/bin/sed'
gccansipedantic=''
gccosandvers=''
gccversion='3.3.3 20040217 (Gentoo Linux 3.3.3, propolice-3.3-7)'
getgrent_r_proto='0'
getgrgid_r_proto='0'
getgrnam_r_proto='0'
gethostbyaddr_r_proto='0'
gethostbyname_r_proto='0'
gethostent_r_proto='0'
getlogin_r_proto='0'
getnetbyaddr_r_proto='0'
getnetbyname_r_proto='0'
getnetent_r_proto='0'
getprotobyname_r_proto='0'
getprotobynumber_r_proto='0'
getprotoent_r_proto='0'
getpwent_r_proto='0'
getpwnam_r_proto='0'
getpwuid_r_proto='0'
getservbyname_r_proto='0'
getservbyport_r_proto='0'
getservent_r_proto='0'
getspnam_r_proto='0'
gidformat='"lu"'
gidsign='1'
gidsize='4'
gidtype='gid_t'
glibpth='/usr/shlib /lib /usr/lib /usr/lib/386 /lib/386 /usr/ccs/lib
/usr/ucblib /usr/local/lib '
gmake='gmake'
gmtime_r_proto='0'
gnulibc_version='2.3.3'
grep='grep'
groupcat='cat /etc/group'
groupstype='gid_t'
gzip='gzip'
h_fcntl='false'
h_sysfile='true'
hint='recommended'
hostcat='cat /etc/hosts'
html1dir=' '
html1direxp=''
html3dir=' '
html3direxp=''
i16size='2'
i16type='short'
i32size='4'
i32type='long'
i64size='8'
i64type='long long'
i8size='1'
i8type='char'
i_arpainet='define'
i_bsdioctl=''
i_crypt='define'
i_db='define'
i_dbm=''
i_dirent='define'
i_dld=''
i_dlfcn='define'
i_fcntl=''
i_float='define'
i_fp=''
i_fp_class=''
i_gdbm='define'
i_grp='define'
i_ieeefp=''
i_inttypes='define'
i_langinfo='define'
i_libutil=''
i_limits='define'
i_locale='define'
i_machcthr=''
i_malloc='define'
i_math='define'
i_memory=''
i_mntent='define'
i_ndbm='define'
i_netdb='define'
i_neterrno=''
i_netinettcp='define'
i_niin='define'
i_poll='define'
i_prot=''
i_pthread='define'
i_pwd='define'
i_rpcsvcdbm=''
i_sfio=''
i_sgtty=''
i_shadow='define'
i_socks=''
i_stdarg='define'
i_stddef='define'
i_stdlib='define'
i_string='define'
i_sunmath=''
i_sysaccess=''
i_sysdir='define'
i_sysfile='define'
i_sysfilio=''
i_sysin=''
i_sysioctl='define'
i_syslog='define'
i_sysmman='define'
i_sysmode=''
i_sysmount='define'
i_sysndir=''
i_sysparam='define'
i_sysresrc='define'
i_syssecrt=''
i_sysselct='define'
i_syssockio=''
i_sysstat='define'
i_sysstatfs='define'
i_sysstatvfs='define'
i_systime='define'
i_systimek=''
i_systimes='define'
i_systypes='define'
i_sysuio='define'
i_sysun='define'
i_sysutsname='define'
i_sysvfs='define'
i_syswait='define'
i_termio=''
i_termios='define'
i_time='define'
i_unistd='define'
i_ustat='define'
i_utime='define'
i_values='define'
i_varargs=''
i_varhdr='stdarg.h'
i_vfork=''
ignore_versioned_solibs='y'
inc_version_list='5.8.2 5.8.2/i686-linux 5.8.4 5.8.4/i686-linux 5.8.5
5.8.5/i686-linux '
inc_version_list_init='"5.8.2","5.8.2/i686-linux","5.8.4","5.8.4/i686-linux","5.8.5","5.8.5/i686-linux",0'
incpath=''
inews=''
installarchlib='/usr/lib/perl5/5.8.6/i686-linux'
installbin='/usr/bin'
installhtml1dir=''
installhtml3dir=''
installman1dir='/usr/share/man/man1'
installman3dir='/usr/share/man/man3'
installprefix='/usr'
installprefixexp='/usr'
installprivlib='/usr/lib/perl5/5.8.6'
installscript='/usr/bin'
installsitearch='/usr/lib/perl5/site_perl/5.8.6/i686-linux'
installsitebin='/usr/bin'
installsitehtml1dir=''
installsitehtml3dir=''
installsitelib='/usr/lib/perl5/site_perl/5.8.6'
installsiteman1dir='/usr/share/man/man1'
installsiteman3dir='/usr/share/man/man3'
installsitescript='/usr/bin'
installstyle='lib/perl5'
installusrbinperl=''
installvendorarch='/usr/lib/perl5/vendor_perl/5.8.6/i686-linux'
installvendorbin='/usr/bin'
installvendorhtml1dir=''
installvendorhtml3dir=''
installvendorlib='/usr/lib/perl5/vendor_perl/5.8.6'
installvendorman1dir='/usr/share/man/man1'
installvendorman3dir='/usr/share/man/man3'
installvendorscript='/usr/bin'
intsize='4'
issymlink='test -h'
ivdformat='"ld"'
ivsize='4'
ivtype='long'
known_extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf
Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob
Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util
MIME/Base64 NDBM_File ODBM_File Opcode POSIX PerlIO/encoding
PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname
Sys/Syslog Thread Time/HiRes Unicode/Normalize XS/APItest XS/Typemap
attrs re threads threads/shared'
ksh=''
ld='gcc'
lddlflags='-shared -L/usr/local/lib'
ldflags=' -L/usr/local/lib'
ldflags_uselargefiles=''
ldlibpthname='LD_LIBRARY_PATH'
less='less'
lib_ext='.a'
libc='/lib/libc-2.3.3.so'
libperl='libperl.a'
libpth='/usr/local/lib /lib /usr/lib'
libs='-lpthread -lnsl -lndbm -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc'
libsdirs=' /usr/lib'
libsfiles=' libpthread.so libnsl.so libndbm.so libgdbm.so libdb.so
libdl.so libm.so libcrypt.so libutil.so libc.so'
libsfound=' /usr/lib/libpthread.so /usr/lib/libnsl.so
/usr/lib/libndbm.so /usr/lib/libgdbm.so /usr/lib/libdb.so
/usr/lib/libdl.so /usr/lib/libm.so /usr/lib/libcrypt.so
/usr/lib/libutil.so /usr/lib/libc.so'
libspath=' /usr/local/lib /lib /usr/lib'
libswanted='pthread sfio socket bind inet nsl nm ndbm gdbm dbm db malloc
dl dld ld sun m crypt sec util c cposix posix ucb BSD'
libswanted_uselargefiles=''
line=''
lint=''
lkflags=''
ln='ln'
lns='/bin/ln -s'
localtime_r_proto='0'
locincpth=' '
loclibpth='/usr/local/lib /opt/local/lib /usr/gnu/lib /opt/gnu/lib
/usr/GNU/lib /opt/GNU/lib'
longdblsize='12'
longlongsize='8'
longsize='4'
lp=''
lpr=''
ls='ls'
lseeksize='8'
lseektype='off_t'
mail=''
mailx=''
make='make'
make_set_make='#'
mallocobj=''
mallocsrc=''
malloctype='void *'
man1dir='/usr/share/man/man1'
man1direxp='/usr/share/man/man1'
man1ext='1'
man3dir='/usr/share/man/man3'
man3direxp='/usr/share/man/man3'
man3ext='3pm'
mips_type=''
mistrustnm=''
mkdir='mkdir'
mmaptype='void *'
modetype='mode_t'
more='more'
multiarch=''
mv=''
myarchname='i686-linux'
mydomain='.med.usherbrooke.ca'
myhostname='denethor'
myuname='linux denethor 2.6.5-gentoo-r1 #1 fri may 28 17​:11​:18 edt 2004
i686 intel(r) pentium(r) 4 cpu 2.40ghz genuineintel gnulinux '
n='-n'
need_va_copy=''
netdb_hlen_type='size_t'
netdb_host_type='const void *'
netdb_name_type='const char *'
netdb_net_type='in_addr_t'
nm='nm'
nm_opt=''
nm_so_opt='--dynamic'
nonxs_ext='Errno'
nroff='nroff'
nvEUformat='"E"'
nvFUformat='"F"'
nvGUformat='"G"'
nv_preserves_uv_bits='32'
nveformat='"e"'
nvfformat='"f"'
nvgformat='"g"'
nvsize='8'
nvtype='double'
o_nonblock='O_NONBLOCK'
obj_ext='.o'
old_pthread_create_joinable=''
optimize='-O3 -march=pentium4 -fomit-frame-pointer -pipe'
orderlib='false'
osname='linux'
osvers='2.6.5-gentoo-r1'
otherlibdirs=' '
package='perl5'
pager='/usr/bin/less'
passcat='cat /etc/passwd'
patchlevel='8'
path_sep='​:'
perl=''
perl5='/usr/bin/perl'
perl_patchlevel=''
perladmin='Gentoo@​denethor.med.usherbrooke.ca'
perllibs='-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc'
perlpath='/usr/bin/perl'
pg='pg'
phostname='hostname'
pidtype='pid_t'
plibpth=''
pmake=''
pr=''
prefix='/usr'
prefixexp='/usr'
privlib='/usr/lib/perl5/5.8.6'
privlibexp='/usr/lib/perl5/5.8.6'
procselfexe='"/proc/self/exe"'
prototype='define'
ptrsize='4'
quadkind='3'
quadtype='long long'
randbits='48'
randfunc='drand48'
random_r_proto='0'
randseedtype='long'
ranlib='​:'
rd_nodata='-1'
readdir64_r_proto='0'
readdir_r_proto='0'
revision='5'
rm='rm'
rmail=''
run=''
runnm='false'
sPRIEUldbl='"LE"'
sPRIFUldbl='"LF"'
sPRIGUldbl='"LG"'
sPRIXU64='"LX"'
sPRId64='"Ld"'
sPRIeldbl='"Le"'
sPRIfldbl='"Lf"'
sPRIgldbl='"Lg"'
sPRIi64='"Li"'
sPRIo64='"Lo"'
sPRIu64='"Lu"'
sPRIx64='"Lx"'
sSCNfldbl='"Lf"'
sched_yield='sched_yield()'
scriptdir='/usr/bin'
scriptdirexp='/usr/bin'
sed='sed'
seedfunc='srand48'
selectminbits='32'
selecttype='fd_set *'
sendmail=''
setgrent_r_proto='0'
sethostent_r_proto='0'
setlocale_r_proto='0'
setnetent_r_proto='0'
setprotoent_r_proto='0'
setpwent_r_proto='0'
setservent_r_proto='0'
sh='/bin/sh'
shar=''
sharpbang='#!'
shmattype='void *'
shortsize='2'
shrpenv=''
shsharp='true'
sig_count='65'
sig_name='ZERO HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2
PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM
PROF WINCH IO PWR SYS NUM32 NUM33 NUM34 RTMIN NUM36 NUM37 NUM38 NUM39
NUM40 NUM41 NUM42 NUM43 NUM44 NUM45 NUM46 NUM47 NUM48 NUM49 NUM50 NUM51
NUM52 NUM53 NUM54 NUM55 NUM56 NUM57 NUM58 NUM59 NUM60 NUM61 NUM62 NUM63
RTMAX IOT CLD POLL UNUSED '
sig_name_init='"ZERO", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT",
"BUS", "FPE", "KILL", "USR1", "SEGV", "USR2", "PIPE", "ALRM", "TERM",
"STKFLT", "CHLD", "CONT", "STOP", "TSTP", "TTIN", "TTOU", "URG", "XCPU",
"XFSZ", "VTALRM", "PROF", "WINCH", "IO", "PWR", "SYS", "NUM32", "NUM33",
"NUM34", "RTMIN", "NUM36", "NUM37", "NUM38", "NUM39", "NUM40", "NUM41",
"NUM42", "NUM43", "NUM44", "NUM45", "NUM46", "NUM47", "NUM48", "NUM49",
"NUM50", "NUM51", "NUM52", "NUM53", "NUM54", "NUM55", "NUM56", "NUM57",
"NUM58", "NUM59", "NUM60", "NUM61", "NUM62", "NUM63", "RTMAX", "IOT",
"CLD", "POLL", "UNUSED", 0'
sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 6 17 29 31 '
sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 6, 17, 29, 31, 0'
sig_size='69'
signal_t='void'
sitearch='/usr/lib/perl5/site_perl/5.8.6/i686-linux'
sitearchexp='/usr/lib/perl5/site_perl/5.8.6/i686-linux'
sitebin='/usr/bin'
sitebinexp='/usr/bin'
sitehtml1dir=''
sitehtml1direxp=''
sitehtml3dir=''
sitehtml3direxp=''
sitelib='/usr/lib/perl5/site_perl/5.8.6'
sitelib_stem='/usr/lib/perl5/site_perl'
sitelibexp='/usr/lib/perl5/site_perl/5.8.6'
siteman1dir='/usr/share/man/man1'
siteman1direxp='/usr/share/man/man1'
siteman3dir='/usr/share/man/man3'
siteman3direxp='/usr/share/man/man3'
siteprefix='/usr'
siteprefixexp='/usr'
sitescript='/usr/bin'
sitescriptexp='/usr/bin'
sizesize='4'
sizetype='size_t'
sleep=''
smail=''
so='so'
sockethdr=''
socketlib=''
socksizetype='socklen_t'
sort='sort'
spackage='Perl5'
spitshell='cat'
srand48_r_proto='0'
srandom_r_proto='0'
src='.'
ssizetype='ssize_t'
startperl='#!/usr/bin/perl'
startsh='#!/bin/sh'
static_ext=' '
stdchar='char'
stdio_base='((fp)->_IO_read_base)'
stdio_bufsiz='((fp)->_IO_read_end - (fp)->_IO_read_base)'
stdio_cnt='((fp)->_IO_read_end - (fp)->_IO_read_ptr)'
stdio_filbuf=''
stdio_ptr='((fp)->_IO_read_ptr)'
stdio_stream_array=''
strerror_r_proto='0'
strings='/usr/include/string.h'
submit=''
subversion='6'
sysman='/usr/share/man/man1'
tail=''
tar=''
targetarch=''
tbl=''
tee=''
test='test'
timeincl='/usr/include/sys/time.h /usr/include/time.h '
timetype='time_t'
tmpnam_r_proto='0'
to='​:'
touch='touch'
tr='tr'
trnl='\n'
troff=''
ttyname_r_proto='0'
u16size='2'
u16type='unsigned short'
u32size='4'
u32type='unsigned long'
u64size='8'
u64type='unsigned long long'
u8size='1'
u8type='unsigned char'
uidformat='"lu"'
uidsign='1'
uidsize='4'
uidtype='uid_t'
uname='uname'
uniq='uniq'
uquadtype='unsigned long long'
use5005threads=''
use64bitall=''
use64bitint=''
usecrosscompile=''
usedl='define'
usefaststdio='define'
useithreads=''
uselargefiles='define'
uselongdouble=''
usemallocwrap='define'
usemorebits=''
usemultiplicity=''
usemymalloc='n'
usenm='false'
useopcode='true'
useperlio='define'
useposix='true'
usereentrant=''
usesfio='false'
useshrplib='false'
usesocks=''
usethreads=''
usevendorprefix='define'
usevfork='false'
usrinc='/usr/include'
uuname=''
uvXUformat='"lX"'
uvoformat='"lo"'
uvsize='4'
uvtype='unsigned long'
uvuformat='"lu"'
uvxformat='"lx"'
vendorarch='/usr/lib/perl5/vendor_perl/5.8.6/i686-linux'
vendorarchexp='/usr/lib/perl5/vendor_perl/5.8.6/i686-linux'
vendorbin='/usr/bin'
vendorbinexp='/usr/bin'
vendorhtml1dir=' '
vendorhtml1direxp=''
vendorhtml3dir=' '
vendorhtml3direxp=''
vendorlib='/usr/lib/perl5/vendor_perl/5.8.6'
vendorlib_stem='/usr/lib/perl5/vendor_perl'
vendorlibexp='/usr/lib/perl5/vendor_perl/5.8.6'
vendorman1dir='/usr/share/man/man1'
vendorman1direxp='/usr/share/man/man1'
vendorman3dir='/usr/share/man/man3'
vendorman3direxp='/usr/share/man/man3'
vendorprefix='/usr'
vendorprefixexp='/usr'
vendorscript='/usr/bin'
vendorscriptexp='/usr/bin'
version='5.8.6'
version_patchlevel_string='version 8 subversion 6'
versiononly=''
vi=''
voidflags='15'
xlibpth='/usr/lib/386 /lib/386'
yacc='yacc'
yaccflags='-DPERL5 '
zcat=''
zip='zip'

--
Please note that ash-trays are provided for the use of smokers,
whereas the floor is provided for the use of all patrons.
  -- Bill Royston

@p5pRT
Copy link
Author

p5pRT commented Jul 20, 2005

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Jul 20, 2005

From @ysth

On Wed, Jul 20, 2005 at 01​:27​:51AM +0100, Dave Mitchell wrote​:

On Mon, Mar 21, 2005 at 08​:42​:11PM -0000, philippe. cote @​ usherbrooke. ca wrote​:

sv_rvweaken doesn't handle tied variables

Proof :

+-------------------------------------------------------------------------+
Sample code
+-------------------------------------------------------------------------+
#!/usr/bin/perl
use strict;
use warnings;
use Util​::Monitor;

use Scalar​::Util qw(weaken);
use Devel​::Peek;
{
my (@​a);
$a[0] = \@​a;
#tie @​a, 'TestArray';
Dump($a[0],1);
weaken($a[0]);
Dump($a[0],1);
print "Leaving scope\n";
}
print "Scope left\n";

package TestArray;
use Tie​::Array;
use base 'Tie​::StdArray';

sub DESTROY { print "Monitor​::TestArray​::DESTROY : $_[0]\n"; }

I'm not really sure what you expect the effect of weakening a tied array
element should be. I suspect that in the general case doing this makes no
sense.

To put it another way, the tied element $a[0] acts like a black box around
whatever the tying object does; you can put things in the box or take them
out, but you can't modify the contents of the box the way weaken does.

Unless someone implements support for a WEAKEN method...

@p5pRT
Copy link
Author

p5pRT commented Jul 20, 2005

From philippe.cote@usherbrooke.ca

I developped a tool for detecting memory leaks from variables with
circular references. (See Devel​::Monitor on CPAN). The main use is for
mod_perl. I tie variables and print out a message when the variable is
destroyed using the DESTROY method. So, using some prints into a log file,
I can find out objects that contain circular references. Now that I know
which variables create memory leaks, I correct them with a "weaken" on the
circular reference instead of using some destructors like XML​::DOM or
whatever. But, the problem is that I can't verify that the memory leak is
corrected since "weaken" doesn't work on a tied variable. Weaken is simply
inneffective on the reference. So the only way to be sure that it now
works is to test it manually after having removing every tie. I can't
monitor memory leaks accurately...

So, what I expect is that "weaken" works on tied variables just like every
other variables.

Forgive my bad english.

Philippe Côté

"Dave Mitchell via RT" <perlbug-followup@​perl.org> wrote :

I'm not really sure what you expect the effect of weakening a tied array
element should be. I suspect that in the general case doing this makes no
sense.

On Mon, Mar 21, 2005 at 08​:42​:11PM -0000, philippe. cote @​ usherbrooke.
ca wrote​:

sv_rvweaken doesn't handle tied variables
Proof :
+-------------------------------------------------------------------------+
Sample code
+-------------------------------------------------------------------------+
#!/usr/bin/perl
use strict;
use warnings;
use Util​::Monitor;
use Scalar​::Util qw(weaken);
use Devel​::Peek;
{
my (@​a);
$a[0] = \@​a;
#tie @​a, 'TestArray';
Dump($a[0],1);
weaken($a[0]);
Dump($a[0],1);
print "Leaving scope\n";
}
print "Scope left\n";
package TestArray;
use Tie​::Array;
use base 'Tie​::StdArray';
sub DESTROY { print "Monitor​::TestArray​::DESTROY : $_[0]\n"; }

1;
+-------------------------------------------------------------------------+
Output without "tie @​a, 'TestArray'"
(Just to show you that weaken works without the tie)
+-------------------------------------------------------------------------+
SV = RV(0x81829c0) at 0x814127c
REFCNT = 1
FLAGS = (ROK)
RV = 0x814e740
SV = PVAV(0x81426cc) at 0x814e740
REFCNT = 2
FLAGS = (PADBUSY,PADMY)
IV = 0
NV = 0
ARRAY = 0x8148888
FILL = 0
MAX = 3
ARYLEN = 0x0
FLAGS = (REAL)
SV = RV(0x81829c0) at 0x814127c
REFCNT = 1
FLAGS = (ROK,WEAKREF,IsUV)
RV = 0x814e740
SV = PVAV(0x81426cc) at 0x814e740
REFCNT = 1
FLAGS = (PADBUSY,PADMY,RMG)
IV = 0
NV = 0
MAGIC = 0x8266f08
MG_VIRTUAL = &PL_vtbl_backref
MG_TYPE = PERL_MAGIC_backref(<)
MG_FLAGS = 0x02
REFCOUNTED
MG_OBJ = 0x81411c8
SV = PVAV(0x8263704) at 0x81411c8
REFCNT = 2
FLAGS = ()
IV = 0
NV = 0
ARRAY = 0x82677e8
FILL = 0
MAX = 3
ARYLEN = 0x0
FLAGS = (REAL)
ARRAY = 0x8148888
FILL = 0
MAX = 3
ARYLEN = 0x0
FLAGS = (REAL)
Leaving scope
Scope left
+-------------------------------------------------------------------------+
Output with "tie @​a, 'TestArray';"
+-------------------------------------------------------------------------+
SV = PVLV(0x817c568) at 0x81413f0
REFCNT = 1
FLAGS = (TEMP,GMG,SMG,RMG)
IV = 0
NV = 0
PV = 0
MAGIC = 0x81505b8
MG_VIRTUAL = &PL_vtbl_packelem
MG_TYPE = PERL_MAGIC_tiedelem(p)
MG_FLAGS = 0x02
REFCOUNTED
MG_OBJ = 0x814139c
SV = RV(0x81829ac) at 0x814139c
REFCNT = 2
FLAGS = (ROK)
RV = 0x8141354
TYPE = t
TARGOFF = 0
TARGLEN = 0
TARG = 0x81413f0
SV = PVLV(0x817c568) at 0x81413f0
REFCNT = 1
FLAGS = (TEMP,GMG,SMG,RMG)
IV = 0
NV = 0
PV = 0
MAGIC = 0x81505b8
MG_VIRTUAL = &PL_vtbl_packelem
MG_TYPE = PERL_MAGIC_tiedelem(p)
MG_FLAGS = 0x02
REFCOUNTED
MG_OBJ = 0x814139c
SV = RV(0x81829ac) at 0x814139c
REFCNT = 2
FLAGS = (ROK)
RV = 0x8141354
TYPE = t
TARGOFF = 0
TARGLEN = 0
TARG = 0x81413f0
Leaving scope
Scope left
Monitor​::TestArray​::DESTROY : TestArray=ARRAY(0x8141354)
+-------------------------------------------------------------------------+
Explanations
+-------------------------------------------------------------------------+
We see that weaken is not applied on a tied variable. I've been
searching in source code and calls goes like this :
Scalar​::Util​::weaken -> sv_rvweaken -> Perl_sv_rvweaken
+-------------------------------------------------------------------------+
Scalar​::Util​::weaken source code
+-------------------------------------------------------------------------+
void
weaken(sv)
SV *sv
PROTOTYPE​: $
CODE​:
#ifdef SvWEAKREF
sv_rvweaken(sv);
#else
croak("weak references are not implemented in this release of
perl");
#endif
We see clearly that it only calls sv_rvweaken from the perl source code.
So this method doesn't contain bugs.
We also finds that sv_rvweaken is associated to Perl_sv_rvweaken as
defined by embed.h
Let's look at this code
+-------------------------------------------------------------------------+
Perl_sv_rvweaken source code from sv.c
+-------------------------------------------------------------------------+
/*
=for apidoc sv_rvweaken
Weaken a reference​: set the C<SvWEAKREF> flag on this RV; give the
referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
push a back-reference to this RV onto the array of backreferences
associated with that magic.
=cut
*/
SV *
Perl_sv_rvweaken(pTHX_ SV *sv)
{
SV *tsv;
if (!SvOK(sv)) /* let undefs pass */
return sv;
if (!SvROK(sv))
Perl_croak(aTHX_ "Can't weaken a nonreference");
else if (SvWEAKREF(sv)) {
if (ckWARN(WARN_MISC))
Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is
already weak");
return sv;
}
tsv = SvRV(sv);
sv_add_backref(tsv, sv);
SvWEAKREF_on(sv);
SvREFCNT_dec(tsv);
return sv;
}
+-------------------------------------------------------------------------+
Conclusion
+-------------------------------------------------------------------------+
The bug is in Perl_sv_rvweaken there :
if (!SvOK(sv)) /* let undefs pass */
return sv;
This code should be modified like this :
if (!SvOK(sv)) /* undef var or tied object or something else */
if (SvMAGIC(sv)) {
//********************************************/
//********************************************/
//********************************************/
//APPLY WEAKEN HERE (Which I don't know how)
//********************************************/
//********************************************/
//********************************************/
} else {
return sv;
}
}
Thank you
Philippe Cote
Centre de genomique fonctionnelle du Canada

@p5pRT
Copy link
Author

p5pRT commented Jan 8, 2006

From @iabyn

On Tue, Jul 19, 2005 at 09​:15​:28PM -0400, Philippe Côté wrote​:

So, what I expect is that "weaken" works on tied variables just like every
other variables.

You can weaken tied variables; what you can't do is weaken *elements* of
tied arrays and hashes, since they don't really exist.

--
My Dad used to say 'always fight fire with fire', which is probably why
he got thrown out of the fire brigade.

@p5pRT
Copy link
Author

p5pRT commented May 23, 2006

@iabyn - Status changed from 'open' to 'rejected'

@p5pRT p5pRT closed this as completed May 23, 2006
@p5pRT
Copy link
Author

p5pRT commented Dec 12, 2011

From @cpansprout

On Sun Jan 08 11​:57​:14 2006, davem@​iabyn.com wrote​:

On Tue, Jul 19, 2005 at 09​:15​:28PM -0400, Philippe C�t� wrote​:

So, what I expect is that "weaken" works on tied variables just like
every
other variables.

You can weaken tied variables; what you can't do is weaken *elements*
of
tied arrays and hashes, since they don't really exist.

I’ve just been thinking though, that weaken() ought to be calling
get-magic first, and set-magic afterwards, in which case the tie
mechanism could weaken the argument to STORE.

I’ve just noticed a memory leak in my own code, since I made the mistake
of weakening a tied element itself, instead of storing a reference to a
weak reference (the usual workaround).

--

Father Chrysostomos

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant