This is a bug report for perl from tba...@bayen.de,
generated with the help of perlbug 1.34 running under perl v5.8.2.
-----------------------------------------------------------------
I found a really strange bug in the perl core. I set the severity
to "high" because it is so strange. Who knows where this fault
would show himself the next time?!? Don't control your nuclear
power plant with this version of perl... :-)
I had the following error message in a script. I shortened the script
up to the point you see here. It does no more do anything useful but
it raises the error message. Just try it and tell me why I get this
message.
I am using perl from Debian testing (sarge) with no modifications.
It would be nice to hear from you if this was helpful. If not - just
get my thanks for the best and stablest language I ever used.
Stop - BASIC 2.0 on Commodore 64 was very stable too... :-)
Thomas Bayen
******************************************************
#!/usr/bin/perl
#use strict;
#use warnings;
my $debug=0;
my $tmpdir='tmp';
open FILE, ">$tmpdir/x";
close FILE;
if(1){
}else{
map 1, (<*>);
}
local $/;
******************************************************
The error message:
******************************************************
tbayen@jupiter:~/Projekte/DurstHack$ perl test.pl
Can't coerce GLOB to string in concat at test.pl line 7.
tbayen@jupiter:~/Projekte/DurstHack$
******************************************************
-----------------------------------------------------------------
---
Flags:
category=core
severity=high
---
Site configuration information for perl v5.8.2:
Configured by Debian Project at Sat Nov 15 18:33:34 EST 2003.
Summary of my perl5 (revision 5.0 version 8 subversion 2) configuration:
Platform:
osname=linux, osvers=2.4.22-xfs+ti1211,
archname=i386-linux-thread-multi
uname='linux kosh 2.4.22-xfs+ti1211 #1 sat oct 25 10:11:37 est 2003
i686 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
-Dcccdlflags=-fPIC -Darchname=i386-linux -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.8.2 -Darchlib=/usr/lib/perl/5.8.2
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local
-Dsitelib=/usr/local/share/perl/5.8.2
-Dsitearch=/usr/local/lib/perl/5.8.2 -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.2 -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 -I/usr/local/include -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64',
optimize='-O3',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN
-fno-strict-aliasing -I/usr/local/include'
ccversion='', gccversion='3.3.2 (Debian)', 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.2.so, so=so, useshrplib=true,
libperl=libperl.so.5.8.2
gnulibc_version='2.3.2'
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.2:
/etc/perl
/usr/local/lib/perl/5.8.2
/usr/local/share/perl/5.8.2
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.8.2
/usr/share/perl/5.8.2
/usr/local/lib/site_perl
/usr/local/lib/perl/5.8.0
/usr/local/share/perl/5.8.0
.
---
Environment for perl v5.8.2:
HOME=/home/tbayen
LANG=de_DE@euro
LANGUAGE (unset)
LD_LIBRARY_PATH (unset)
LOGDIR (unset)
PATH=/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin
PERL_BADLANG (unset)
SHELL=/bin/bash
Further to this, this _only_ happens with _all_ threaded versions of
Perl (have tested 5.8.0 through 5.9.0, so am not 100% sure about
blead, but I would be surprised if it were fixed there).
Also note that this script contains _all_ necessary elements. Take
any away or make any changes, and the error message goes away.
The deparse on 5.8.0 is slightly different from all later versions:
But all deparses are the same for the threaded and unthreaded version
of a Perl.
$ perl5.8.0-threaded -MO=Deparse strangebug
my $debug = 0;
my $tmpdir = 'tmp';
open FILE, ">$tmpdir/x";
close FILE;
do {
use File::Glob ();
};
local $/;
$ perl5.8.1-threaded -MO=Deparse strangebug
my $debug = 0;
my $tmpdir = 'tmp';
open FILE, ">$tmpdir/x";
close FILE;
use File::Glob ();
do {
()
};
local $/;
Clearly, the "if" is being optimized away. The concat is in the line
with open(), clearly it is complainig about $tmpdir. Anyway, if you
look at the optree generated by a threaded Perl and an unthreaded
Perl, you get the following diff (for 5.8.3):
$ diff -u unthreaded threaded
--- unthreaded 2004-01-15 06:19:16.000000000 +0100
+++ threaded 2004-01-15 06:19:22.000000000 +0100
@@ -2,29 +2,29 @@
1 <0> enter ->2
2 <;> nextstate(main 1 1:5) v ->3
5 <2> sassign vKS/2 ->6
-3 <$> const(IV 0) s ->4
+3 <$> const[IV 0] s ->4
4 <0> padsv[$debug:1,64] sRM*/LVINTRO ->5
6 <;> nextstate(main 2 1:6) v ->7
9 <2> sassign vKS/2 ->a
-7 <$> const(PV "tmp") s ->8
+7 <$> const[PV "tmp"] s ->8
8 <0> padsv[$tmpdir:2,64] sRM*/LVINTRO ->9
a <;> nextstate(main 3 1:7) v ->b
-i <@> open[t6] vK/2 ->j
+i <@> open[t7] vK/2 ->j
b <0> pushmark s ->c
-c <$> gv(*FILE) s ->d
+c <#> gv[*FILE] s ->d
- <1> ex-stringify sK/1 ->i
- <0> ex-pushmark s ->d
h <2> concat[t4] sKS/2 ->i
f <2> concat[t3] sK/2 ->g
-d <$> const(PV ">") s ->e
+d <$> const[PV ">"] s ->e
e <0> padsv[$tmpdir:2,64] s ->f
-g <$> const(PV "/x") s ->h
+g <$> const[PV "/x"] s ->h
j <;> nextstate(main 3 1:8) v ->k
l <1> close vK/1 ->m
-k <$> gv(*FILE) s ->l
+k <#> gv[*FILE] s ->l
m <;> nextstate(main 64 1:9) v ->n
- <@> scope vKP ->o
n <0> stub v ->o
o <;> nextstate(main 64 1:13) v ->p
- <1> ex-rv2sv vKM/129 ->q
-p <$> gvsv(*/) s/LVINTRO ->q
+p <#> gvsv[*/] s/LVINTRO ->q
Seems like there is an off-by-one difference between threaded and
unthreaded here:
-i <@> open[t6] vK/2 ->j
+i <@> open[t7] vK/2 ->j
Liz
Fixed in bleedperl by the patch below.
Dave.
--
Technology is dominated by two types of people: those who understand what
they do not manage, and those who manage what they do not understand.
Change 22160 by davem@davem-percy on 2004/01/15 23:49:02
buigid #24905 - the code planted to call glob() retained an
extraneous targ index in a pushmark op, leasing to strangeness
when the op was freed
Affected files ...
... //depot/perl/op.c#596 edit
Differences ...
==== //depot/perl/op.c#596 (text) ====
@@ -5332,6 +5332,7 @@
o->op_ppaddr = PL_ppaddr[OP_LIST];
cLISTOPo->op_first->op_type = OP_PUSHMARK;
cLISTOPo->op_first->op_ppaddr = PL_ppaddr[OP_PUSHMARK];
+ cLISTOPo->op_first->op_targ = 0;
o = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, o,
scalar(newUNOP(OP_RV2CV, 0,