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

readline argument list is messed up #15706

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

readline argument list is messed up #15706

p5pRT opened this issue Nov 12, 2016 · 4 comments

Comments

@p5pRT
Copy link

p5pRT commented Nov 12, 2016

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

Searchable as RT130076$

@p5pRT
Copy link
Author

p5pRT commented Nov 12, 2016

From @mauke

Created by @mauke

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

readline 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 readline("a", "b", "c")'
readline() on unopened filehandle at -e line 1.
ab

This is what happens when you try it with readline​: Only the last argument is
used; the rest leak through to say. No error is reported.

$ perl -wE 'say readline(1 .. 10)'
readline() on unopened filehandle 10 at -e line 1.
123456789

Despite what the prototype claims, the argument is evaluated in list context.

$ perl -wE 'say "foo", "bar", readline(())'
readline() on unopened filehandle at -e line 1.
foo

If you call it with an empty list, it steals arguments from the surrounding
context (it tries to read from "bar").

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​:13​:51 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​::readline"'
;*

readline 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 readline("a", "b", "c")'
readline() on unopened filehandle at -e line 1.
ab

This is what happens when you try it with readline​: Only the last
argument is
used; the rest leak through to say. No error is reported.

$ perl -wE 'say readline(1 .. 10)'
readline() on unopened filehandle 10 at -e line 1.
123456789

Despite what the prototype claims, the argument is evaluated in list
context.

$ perl -wE 'say "foo", "bar", readline(())'
readline() on unopened filehandle at -e line 1.
foo

If you call it with an empty list, it steals arguments from the
surrounding
context (it tries to read from "bar").

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 3, 2017

From @arc

James E Keenan via RT <perlbug-followup@​perl.org> wrote​:

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

No — #93992 is about how Perl should handle subroutine declarations
that bear prototypes and/or attributes, when the subroutine has
already been defined without them. (Plus a few related cases.)

This ticket relates to the fact that the readline() builtin claims to
have the prototype ";*", but doesn't behave like user subroutines with
that prototype. Tickets #130077 and #130078 relate to similar issues
affecting eof() and getc() respectively. Accordingly, I've undone the
links between #93992 and these tickets.

FWIW, my recollection is that mauke was working on #130076 at the hackathon.

Thanks.

--
Aaron Crane ** http​://aaroncrane.co.uk/

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