Perl / perl5

🐪 The Perl programming language
https://dev.perl.org/perl5/
Other
1.91k stars 542 forks source link

"Can't coerce GLOB to string in concat" but there is no glob :-( #7038

Closed p5pRT closed 20 years ago

p5pRT commented 20 years ago

Migrated from rt.perl.org#24905 (status was 'resolved')

Searchable as RT24905$

p5pRT commented 20 years ago

From tbayen@bayen.de

This is a bug report for perl from tbayen@​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

p5pRT commented 20 years ago

From @lizmat

At 17​:10 +0000 1/14/04\, Thomas Bayen (via RT) wrote​:

----------------------------------------------------------------- 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$ ******************************************************

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

Inline Patch ```diff --- 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

p5pRT commented 20 years ago

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

p5pRT commented 20 years ago

From @iabyn

On Thu\, Jan 15\, 2004 at 06​:18​:04AM +0100\, Elizabeth Mattijsen wrote​:

At 17​:10 +0000 1/14/04\, Thomas Bayen (via RT) wrote​:

****************************************************** #!/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$ ******************************************************

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\,

p5pRT commented 20 years ago

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