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

anonymous sub with attribute in void parse context is ambiguous, should warn #11847

Open
p5pRT opened this issue Jan 5, 2012 · 6 comments
Open

Comments

@p5pRT
Copy link

p5pRT commented Jan 5, 2012

Migrated from rt.perl.org#107604 (status was 'open')

Searchable as RT107604$

@p5pRT
Copy link
Author

p5pRT commented Jan 5, 2012

From @dolmen

Created by dolmen@cpan.org

An anonymous sub with an attribute is parsed correctly by perl, but not in
the
way expected by the user.

$ perl -we 'sub : lvalue { die; my $a }'
Died at -e line 1.

Verified with perl 5.14.2 and 5.10.1.

The problem is that in this void parse context, "sub :" is parsed as a label
instead of as a sub definition. Combined with indirect syntax this makes
valid
Perl code and the sub is transformed in a 'do' immediately executed.

perl -MO=Deparse -e 'sub : lvalue { die; my $a }'
BEGIN { $^W = 1; }
sub​: do {
  die;
  my $a
}->lvalue;
-e syntax OK

Workaround​: force non-void parse context with '+'​:

$ perl -MO=Deparse -e '+sub : lvalue { die; my $a }'
BEGIN { $^W = 1; }
sub : lvalue {
  die;
  my $a;
}
;
-e syntax OK

The case of evaluating an anonymous sub/closure in a void parse context is a
real use case, as this is not really void context from the runtime view when
the statement is the last of the block/file/eval. This becomes more common
with the increased usage of closures in frameworks. For example, a PSGI app
declared as the last statement in a file (loaded with 'do') or as the last
statement of a function.

As this is a case that is ambiguous in the Perl grammar but still
generates valid perl code (but not what the user expects), a warning would
be
helpful to discover those cases.

Olivier Mengué (dolmen)

Perl Info

Flags:
category=core
severity=wishlist

Site configuration information for perl 5.10.1:

Configured by Debian Project at Tue Apr 26 15:53:22 UTC 2011.

Summary of my perl5 (revision 5 version 10 subversion 1) configuration:

Platform:
osname=linux, osvers=2.6.24-29-server,
archname=x86_64-linux-gnu-thread-multi
uname='linux crested 2.6.24-29-server #1 smp wed mar 16 19:04:28 utc 2011
x86_64 x86_64 x86_64 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
-Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local
-Dsitelib=/usr/local/share/perl/5.10.1
-Dsitearch=/usr/local/lib/perl/5.10.1 -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 -Ud_ualarm -Uusesfio -Uusenm
-DDEBUGGING=-g -Doptimize=-O2 -Dplibpth=/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu -Duseshrplib -Dlibperl=libperl.so.5.10.1
-Dd_dosuid -des'
hint=recommended, useposix=true, d_sigaction=define
useithreads=define, usemultiplicity=define
useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
use64bitint=define, use64bitall=define, uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing
-pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64',
optimize='-O2 -g',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe
-fstack-protector -I/usr/local/include'
ccversion='', gccversion='4.5.2', gccosandvers=''
intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
alignbytes=8, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
libpth=/usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu /lib
/usr/lib /lib64 /usr/lib64
libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
perllibs=-ldl -lm -lpthread -lc -lcrypt
libc=, so=so, useshrplib=true, libperl=libperl.so.5.10.1
gnulibc_version='2.13'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib
-fstack-protector'

Locally applied patches:
DEBPKG:debian/arm_thread_stress_timeout -
http://bugs.debian.org/501970Raise the timeout of
ext/threads/shared/t/stress.t to accommodate slower
build hosts
DEBPKG:debian/cpan_config_path - Set location of CPAN::Config to /etc/perl
as /usr may not be writable.
DEBPKG:debian/cpan_definstalldirs - Provide a sensible INSTALLDIRS default
for modules installed from CPAN.
DEBPKG:debian/db_file_ver - http://bugs.debian.org/340047 Remove overly
restrictive DB_File version check.
DEBPKG:debian/doc_info - Replace generic man(1) instructions with
Debian-specific information.
DEBPKG:debian/enc2xs_inc - http://bugs.debian.org/290336 Tweak enc2xs to
follow symlinks and ignore missing @INC directories.
DEBPKG:debian/errno_ver - http://bugs.debian.org/343351 Remove Errno
version check due to upgrade problems with long-running processes.
DEBPKG:debian/extutils_hacks - Various debian-specific ExtUtils changes
DEBPKG:debian/fakeroot - Postpone LD_LIBRARY_PATH evaluation to the binary
targets.
DEBPKG:debian/instmodsh_doc - Debian policy doesn't install .packlist files
for core or vendor.
DEBPKG:debian/ld_run_path - Remove standard libs from LD_RUN_PATH as per
Debian policy.
DEBPKG:debian/libnet_config_path - Set location of libnet.cfg to
/etc/perl/Net as /usr may not be writable.
DEBPKG:debian/m68k_thread_stress - http://bugs.debian.org/495826 Disable
some threads tests on m68k for now due to missing TLS.
DEBPKG:debian/mod_paths - Tweak @INC ordering for Debian
DEBPKG:debian/module_build_man_extensions -
http://bugs.debian.org/479460Adjust Module::Build manual page
extensions for the Debian Perl policy
DEBPKG:debian/perl_synopsis - http://bugs.debian.org/278323 Rearrange
perl.pod
DEBPKG:debian/prune_libs - http://bugs.debian.org/128355 Prune the list of
libraries wanted to what we actually need.
DEBPKG:debian/use_gdbm - Explicitly link against -lgdbm_compat in
ODBM_File/NDBM_File.
DEBPKG:fixes/assorted_docs - http://bugs.debian.org/443733 [384f06a]
Math::BigInt::CalcEmu documentation grammar fix
DEBPKG:fixes/net_smtp_docs - http://bugs.debian.org/100195
[rt.cpan.org#36038] Document the Net::SMTP 'Port' option
DEBPKG:fixes/processPL - http://bugs.debian.org/357264 [rt.cpan.org #17224]
Always use PERLRUNINST when building perl modules.
DEBPKG:debian/perlivp - http://bugs.debian.org/510895 Make perlivp skip
include directories in /usr/local
DEBPKG:fixes/pod2man-index-backslash - http://bugs.debian.org/521256 Escape
backslashes in .IX entries
DEBPKG:debian/disable-zlib-bundling - Disable zlib bundling in
Compress::Raw::Zlib
DEBPKG:fixes/kfreebsd_cppsymbols - http://bugs.debian.org/533098 [3b910a0]
Add gcc predefined macros to $Config{cppsymbols} on GNU/kFreeBSD.
DEBPKG:debian/cpanplus_definstalldirs -
http://bugs.debian.org/533707Configure CPANPLUS to use the site
directories by default.
DEBPKG:debian/cpanplus_config_path - Save local versions of
CPANPLUS::Config::System into /etc/perl.
DEBPKG:fixes/kfreebsd-filecopy-pipes -
http://bugs.debian.org/537555[16f708c] Fix File::Copy::copy with pipes
on GNU/kFreeBSD
DEBPKG:fixes/anon-tmpfile-dir - http://bugs.debian.org/528544 [perl #66452]
Honor TMPDIR when open()ing an anonymous temporary file
DEBPKG:fixes/abstract-sockets - http://bugs.debian.org/329291 [89904c0] Add
support for Abstract namespace sockets.
DEBPKG:fixes/hurd_cppsymbols - http://bugs.debian.org/544307 [eeb92b7] Add
gcc predefined macros to $Config{cppsymbols} on GNU/Hurd.
DEBPKG:fixes/autodie-flock - http://bugs.debian.org/543731 Allow for flock
returning EAGAIN instead of EWOULDBLOCK on linux/parisc
DEBPKG:fixes/archive-tar-instance-error - http://bugs.debian.org/539355 [
rt.cpan.org #48879] Separate Archive::Tar instance error strings from each
other
DEBPKG:fixes/positive-gpos - http://bugs.debian.org/545234 [perl #69056]
[c584a96] Fix \\G crash on first match
DEBPKG:debian/devel-ppport-ia64-optim - http://bugs.debian.org/548943 Work
around an ICE on ia64
DEBPKG:fixes/trie-logic-match - http://bugs.debian.org/552291 [perl #69973]
[0abd0d7] Fix a DoS in Unicode processing [CVE-2009-3626]
DEBPKG:fixes/hppa-thread-eagain - http://bugs.debian.org/554218 make the
threads-shared test suite more robust, fixing failures on hppa
DEBPKG:fixes/crash-on-undefined-destroy -
http://bugs.debian.org/564074[perl #71952] [1f15e67] Fix a NULL
pointer dereference when looking for a
DESTROY method
DEBPKG:fixes/tainted-errno - http://bugs.debian.org/574129 [perl #61976]
[be1cf43] fix an errno stringification bug in taint mode
DEBPKG:fixes/safe-upgrade - http://bugs.debian.org/582978 Upgrade Safe.pm
to 2.25, fixing CVE-2010-1974
DEBPKG:fixes/tell-crash - http://bugs.debian.org/578577 [f4817f3] Fix a
tell() crash on bad arguments.
DEBPKG:fixes/format-write-crash - http://bugs.debian.org/579537 [perl
#22977] [421f30e] Fix a crash in format/write
DEBPKG:fixes/arm-alignment - http://bugs.debian.org/289884 [f1c7503]
Prevent gcc from optimizing the alignment test away on armel
DEBPKG:fixes/fcgi-test - Fix a failure in CGI/t/fast.t when FCGI is
installed
DEBPKG:fixes/hurd-ccflags - http://bugs.debian.org/587901 Make hints/gnu.sh
append to $ccflags rather than overriding them
DEBPKG:debian/squelch-locale-warnings -
http://bugs.debian.org/508764Squelch locale warnings in Debian package
maintainer scripts
DEBPKG:fixes/lc-numeric-docs - http://bugs.debian.org/379329 [perl #78452]
[903eb63] LC_NUMERIC documentation fixes
DEBPKG:fixes/lc-numeric-sprintf - http://bugs.debian.org/601549 [perl
#78632] [b3fd614] Fix sprintf not to ignore LC_NUMERIC with constants
DEBPKG:fixes/concat-stack-corruption - http://bugs.debian.org/596105 [perl
#78674] [e3393f5] Fix stack pointer corruption in pp_concat() with 'use
encoding'
DEBPKG:fixes/cgi-multiline-header -
http://bugs.debian.org/606995[CVE-2010-2761 CVE-2010-4410
CVE-2010-4411] CGI.pm MIME boundary and
multiline header vulnerabilities
DEBPKG:fixes/h2ph-gcc-4.5 - http://bugs.debian.org/599933 [8d66b3f] Fix
h2ph and test
DEBPKG:fixes/threads-tmps-crash - [perl #70411] [24855df] Conditionally
compile tmps stack cleanup code
DEBPKG:patchlevel - http://bugs.debian.org/567489 List packaged patches for
5.10.1-17ubuntu1 in patchlevel.h


@INC for perl 5.10.1:
/home/omengue/.perl/lib/perl5/x86_64-linux-gnu-thread-multi
/home/omengue/.perl/lib/perl5/x86_64-linux-gnu-thread-multi
/home/omengue/.perl/lib/perl5
/etc/perl
/usr/local/lib/perl/5.10.1
/usr/local/share/perl/5.10.1
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.10
/usr/share/perl/5.10
/usr/local/lib/site_perl
.


Environment for perl 5.10.1:
HOME=/home/omengue
LANG=fr_FR.UTF-8
LANGUAGE=fr:en
LD_LIBRARY_PATH (unset)
LOGDIR (unset)
PATH=/home/omengue/bin:/home/omengue/.perl/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
PERL5LIB=/home/omengue/.perl/lib/perl5/x86_64-linux-gnu-thread-multi:/home/omengue/.perl/lib/perl5
PERLBREW_ROOT=/home/omengue/.perl/perlbrew
PERL_BADLANG (unset)
PERL_CPANM_OPT=-l /home/omengue/.perl --mirror
http://distrib-coffee.ipsl.jussieu.fr/pub/mirrors/cpan/
PERL_LOCAL_LIB_ROOT=/home/omengue/.perl
PERL_MB_OPT=--install_base /home/omengue/.perl
PERL_MM_OPT=INSTALL_BASE=/home/omengue/.perl
SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Jan 5, 2012

From zefram@fysh.org

Olivier Mengu?? wrote​:

Workaround​: force non-void parse context with '+'​:

$ perl -MO=Deparse -e '+sub : lvalue { die; my $a }'
BEGIN { $^W = 1; }
sub : lvalue {

Here's an actual bug​: B​::Deparse's output suffers the unintended
interpretation. B​::Deparse needs to be taught the workaround.

-zefram

@p5pRT
Copy link
Author

p5pRT commented Jan 5, 2012

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

@p5pRT
Copy link
Author

p5pRT commented Jan 5, 2012

From @cpansprout

On Thu Jan 05 05​:56​:43 2012, dolmen wrote​:

An anonymous sub with an attribute is parsed correctly by perl, but
not in
the
way expected by the user.

$ perl -we 'sub : lvalue { die; my $a }'
Died at -e line 1.

Verified with perl 5.14.2 and 5.10.1.

The problem is that in this void parse context, "sub :" is parsed as a
label
instead of as a sub definition.

As this is a case that is ambiguous in the Perl grammar but still
generates valid perl code (but not what the user expects), a warning
would
be
helpful to discover those cases.

I wouldn’t be opposed to that, but I think it needs to wait till after 5.16.

--

Father Chrysostomos

@p5pRT
Copy link
Author

p5pRT commented Jun 28, 2016

From @dolmen

Le Jeu 05 Jan 2012 06​:12​:10, zefram@​fysh.org a écrit :

Olivier Mengu?? wrote​:

Workaround​: force non-void parse context with '+'​:

$ perl -MO=Deparse -e '+sub : lvalue { die; my $a }'
BEGIN { $^W = 1; }
sub : lvalue {

Here's an actual bug​: B​::Deparse's output suffers the unintended
interpretation. B​::Deparse needs to be taught the workaround.

I notice the B​::Deparse bug is fixed in perl 5.24.0.

  $ perl -MO=Deparse -e '+sub :lvalue { die; my $a }'
  +sub : lvalue {
  die;
  my $a;
  }
  ;
  -e syntax OK

I would be interested to see the commit that fixed that.

@p5pRT
Copy link
Author

p5pRT commented Jun 30, 2016

From @cpansprout

On Tue Jun 28 02​:20​:08 2016, dolmen wrote​:

Le Jeu 05 Jan 2012 06​:12​:10, zefram@​fysh.org a écrit :

Olivier Mengu?? wrote​:

Workaround​: force non-void parse context with '+'​:

$ perl -MO=Deparse -e '+sub : lvalue { die; my $a }'
BEGIN { $^W = 1; }
sub : lvalue {

Here's an actual bug​: B​::Deparse's output suffers the unintended
interpretation. B​::Deparse needs to be taught the workaround.

I notice the B​::Deparse bug is fixed in perl 5.24.0.

$ perl \-MO=Deparse \-e '\+sub :lvalue \{ die; my $a \}'
\+sub : lvalue \{
    die;
    my $a;
\}
;
\-e syntax OK

I would be interested to see the commit that fixed that.

v5.21.5-218-g6b6b21d

--

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

2 participants