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

getc argument list context is broken #15708

Open
p5pRT opened this issue Nov 12, 2016 · 4 comments
Open

getc argument list context is broken #15708

p5pRT opened this issue Nov 12, 2016 · 4 comments

Comments

@p5pRT
Copy link

p5pRT commented Nov 12, 2016

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

Searchable as RT130078$

@p5pRT
Copy link
Author

p5pRT commented Nov 12, 2016

From @mauke

Created by @mauke

$ perl -wE 'say prototype "CORE​::getc"'
;*

getc claims to take a single (optional) scalar argument.

$ perl -wE 'sub foo (;*); foo("a", "b", "c")'
Too many arguments for main​::foo at -e line 1, near ""c")
"
Execution of -e aborted due to compilation errors.

This is what happens when you use the same prototype on a sub.

$ perl -wE 'say getc("a", "b", "c")'
Useless use of a constant ("a") in void context at -e line 1.
Useless use of a constant ("b") in void context at -e line 1.
getc() on unopened filehandle at -e line 1.
Use of uninitialized value in say at -e line 1.

This is what happens when you try it with getc​: Instead of erroring out (too
many arguments) it treats it as a scalar comma operator, throwing all but the
last argument away.

$ perl -MO=Deparse -e 'getc(())'
getc ARGV;
-e syntax OK

... unless the argument is (). Instead of evaluating it in scalar context (and
getting undef), it silently replaces it by ARGV.

This is especially weird because getc is supposed to default to STDIN, not
ARGV.

Perl Info

Flags:
    category=core
    severity=low

Site configuration information for perl 5.24.0:

Configured by mauke at Mon May  9 21:21:33 CEST 2016.

Summary of my perl5 (revision 5 version 24 subversion 0) configuration:
   
  Platform:
    osname=linux, osvers=4.4.5-1-arch, archname=i686-linux
    uname='linux simplicio 4.4.5-1-arch #1 smp preempt thu mar 10 07:54:30 cet 2016 i686 gnulinux '
    config_args=''
    hint=previous, useposix=true, d_sigaction=define
    useithreads=undef, usemultiplicity=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2 -flto',
    cppflags='-fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
    ccversion='', gccversion='6.1.1 20160501', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234, doublekind=3
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12, longdblkind=3
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=4, prototype=define
  Linker and Libraries:
    ld='cc', ldflags ='-fstack-protector-strong -L/usr/local/lib -flto'
    libpth=/usr/local/lib /usr/lib/gcc/i686-pc-linux-gnu/6.1.1/include-fixed /usr/lib /lib /usr/local/lib /usr/lib/gcc/i686-pc-linux-gnu/6.1.1/include-fixed /usr/lib
    libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat
    perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
    libc=libc-2.23.so, so=so, useshrplib=false, libperl=libperl.a
    gnulibc_version='2.23'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -flto -L/usr/local/lib -fstack-protector-strong'



@INC for perl 5.24.0:
    /home/mauke/usr/lib/perl5/site_perl/5.24.0/i686-linux
    /home/mauke/usr/lib/perl5/site_perl/5.24.0
    /home/mauke/usr/lib/perl5/5.24.0/i686-linux
    /home/mauke/usr/lib/perl5/5.24.0
    .


Environment for perl 5.24.0:
    HOME=/home/mauke
    LANG=en_US.UTF-8
    LANGUAGE=en_US
    LC_COLLATE=C
    LC_MONETARY=de_DE.UTF-8
    LC_TIME=de_DE.UTF-8
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/home/mauke/perl5/perlbrew/bin:/home/mauke/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
    PERLBREW_BASHRC_VERSION=0.73
    PERLBREW_HOME=/home/mauke/.perlbrew
    PERLBREW_ROOT=/home/mauke/perl5/perlbrew
    PERL_BADLANG (unset)
    PERL_UNICODE=SAL
    SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Dec 31, 2016

From @jkeenan

On Sat, 12 Nov 2016 15​:30​:25 GMT, mauke- wrote​:

This is a bug report for perl from l.mai@​web.de,
generated with the help of perlbug 1.40 running under perl 5.24.0.

-----------------------------------------------------------------
[Please describe your issue here]

$ perl -wE 'say prototype "CORE​::getc"'
;*

getc claims to take a single (optional) scalar argument.

$ perl -wE 'sub foo (;*); foo("a", "b", "c")'
Too many arguments for main​::foo at -e line 1, near ""c")
"
Execution of -e aborted due to compilation errors.

This is what happens when you use the same prototype on a sub.

$ perl -wE 'say getc("a", "b", "c")'
Useless use of a constant ("a") in void context at -e line 1.
Useless use of a constant ("b") in void context at -e line 1.
getc() on unopened filehandle at -e line 1.
Use of uninitialized value in say at -e line 1.

This is what happens when you try it with getc​: Instead of erroring
out (too
many arguments) it treats it as a scalar comma operator, throwing all
but the
last argument away.

$ perl -MO=Deparse -e 'getc(())'
getc ARGV;
-e syntax OK

... unless the argument is (). Instead of evaluating it in scalar
context (and
getting undef), it silently replaces it by ARGV.

This is especially weird because getc is supposed to default to STDIN,
not
ARGV.

Is this problem similar to that reported by sprout in https://rt-archive.perl.org/perl5/Ticket/Display.html?id=93992?

--
James E Keenan (jkeenan@​cpan.org)

@p5pRT
Copy link
Author

p5pRT commented Dec 31, 2016

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

@p5pRT
Copy link
Author

p5pRT commented Jan 16, 2017

From zefram@fysh.org

l.mai@​web.de wrote​:

This is what happens when you try it with getc​: Instead of erroring out (too
many arguments) it treats it as a scalar comma operator, throwing all but the
last argument away.

Yes. It is in fact equivalent to what you get with foo(("a","b","c")).
Much as I'd like to make the argument parsing perfectly consistent
between subs and builtins, it's very difficult for us to change either,
due to backcompat issues.

-zefram

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