Front page | perl.perl5.porters |
Postings from April 2007
[perl #42695] very strange closure problem
Thread Next
From:
Andrew White
Date:
April 23, 2007 23:43
Subject:
[perl #42695] very strange closure problem
Message ID:
rt-3.6.HEAD-30201-1177371390-480.42695-75-0@perl.org
# New Ticket Created by Andrew White
# Please include the string: [perl #42695]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=42695 >
This is a bug report for perl from aewhite@uark.edu,
generated with the help of perlbug 1.35 running under perl v5.8.7.
-----------------------------------------------------------------
Strange things have happened before but this is the best...
Basicly, anonymous functions in package subs break on returning
vars that are in the package scope unless the var is referenced
somewhere in the package sub.
This is best explained by code. Compare print_A_broken and
print_A_strange. Follows is bar.pl and Foo.pm
##bar.pl##
#!/usr/bin/perl -wT
use strict;
use lib ('.');
use Foo;
Foo::print_A_ok();
Foo::print_A_broken();
Foo::print_A_strange();
##Foo.pm##
package Foo;
use strict;
my $varA = 'A';
sub print_A_ok { print "Works ", $varA, "\n" };
sub print_A_broken {
my %funcs = ( 'A' => sub {return $varA;});
print "Broken ", $funcs{'A'}(), "\n";
};
sub print_A_strange {
my %funcs = ( 'A' => sub {return $varA;} );
$varA = $varA; # this line fixes it!? WTF Also a print $varA fixes it!?
print "Strange ", $funcs{'A'}(), "\n";
};
return 1;
##output##
Works A
Use of uninitialized value in print at Foo.pm line 13.
Broken
Strange A
Sorry if this is a repeat. I couldn't find anything that was
still open on the site, but I could have missed it. Also, I
hope this isn't a feature ;)
Thanks,
Andrew
-----------------------------------------------------------------
---
Flags:
category=core
severity=medium
---
Site configuration information for perl v5.8.7:
Configured by Debian Project at Fri Dec 16 08:00:01 UTC 2005.
Summary of my perl5 (revision 5 version 8 subversion 7) configuration:
Platform:
osname=linux, osvers=2.6.10, archname=i486-linux-gnu-thread-multi
uname='linux rothera 2.6.10 #1 smp fri may 13 09:24:22 utc 2005 i686
gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
-Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.8 -Darchlib=/usr/lib/perl/5.8
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local
-Dsitelib=/usr/local/share/perl/5.8.7
-Dsitearch=/usr/local/lib/perl/5.8.7 -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1
-Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl
-Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Uusesfio -Uusenm
-Duseshrplib -Dlibperl=libperl.so.5.8.7 -Dd_dosuid -des'
hint=recommended, useposix=true, d_sigaction=define
usethreads=define use5005threads=undef useithreads=define
usemultiplicity=define
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=undef use64bitall=undef uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS
-DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
optimize='-O2',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN
-fno-strict-aliasing -pipe -I/usr/local/include'
ccversion='', gccversion='4.0.3 20051204 (prerelease) (Ubuntu
4.0.2-5ubuntu2)', 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='cc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
perllibs=-ldl -lm -lpthread -lc -lcrypt
libc=/lib/libc-2.3.5.so, so=so, useshrplib=true,
libperl=libperl.so.5.8.7
gnulibc_version='2.3.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:
SPRINTF0 - fixes for sprintf formatting issues - CVE-2005-3962
---
@INC for perl v5.8.7:
/etc/perl
/usr/local/lib/perl/5.8.7
/usr/local/share/perl/5.8.7
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.8
/usr/share/perl/5.8
/usr/local/lib/site_perl
.
---
Environment for perl v5.8.7:
HOME=/home/aewhite
LANG=en_CA.UTF-8
LANGUAGE=en_CA:en
LD_LIBRARY_PATH (unset)
LOGDIR (unset)
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games
PERL_BADLANG (unset)
SHELL=/bin/bash
Thread Next
-
[perl #42695] very strange closure problem
by Andrew White