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

octal version number funny parsing in use #9994

Open
p5pRT opened this issue Nov 30, 2009 · 3 comments
Open

octal version number funny parsing in use #9994

p5pRT opened this issue Nov 30, 2009 · 3 comments

Comments

@p5pRT
Copy link

p5pRT commented Nov 30, 2009

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

Searchable as RT70938$

@p5pRT
Copy link
Author

p5pRT commented Nov 30, 2009

From zefram@fysh.org

Created by zefram@fysh.org

$ perl -lwe 'use Time​::HiRes 01.99; print "ok"'
ok

This is a funny result considering that Time​::HiRes is at version 1.9719
on this system. Look at some related version numbers​:

$ perl -lwe 'use Time​::HiRes 1.99; print "ok"'
Time​::HiRes version 1.99 required--this is only version 1.9719 at -e line 1.
BEGIN failed--compilation aborted at -e line 1.
$ perl -lwe 'use Time​::HiRes 010.99; print "ok"'
Time​::HiRes version 8 required--this is only version 1.9719 at -e line 1.
BEGIN failed--compilation aborted at -e line 1.
$ perl -lwe 'use Time​::HiRes +01.99; print "ok"'
Time​::HiRes version 199 required--this is only version 1.9719 at /usr/local/share/perl/5.10.0/Exporter/Heavy.pm line 123.
BEGIN failed--compilation aborted at -e line 1.
$ perl -lwe 'use Time​::HiRes 1,99; print "ok"'
Time​::HiRes version 99 required--this is only version 1.9719 at /usr/local/share/perl/5.10.0/Exporter/Heavy.pm line 123.
BEGIN failed--compilation aborted at -e line 1.

Apparently, in "01.99", the "01" is being interpreted as an octal number,
and the ".99" is being interpreted as "0.99" and being passed to import.
(You can't see the effect of the 0.99 in this sequence, but it's visible
if you write your own import.) This is unlike the parsing of "01.99"
in ordinary code, where it parses like "(01).(99)" and results in the
string "199". It's a confusing difference. Bug? Not sure.

Perl Info

Flags:
    category=core
    severity=low

Site configuration information for perl 5.10.0:

Configured by Debian Project at Fri Aug 28 22:30:10 UTC 2009.

Summary of my perl5 (revision 5 version 10 subversion 0) configuration:
  Platform:
    osname=linux, osvers=2.6.26-2-amd64, archname=i486-linux-gnu-thread-multi
    uname='linux puccini 2.6.26-2-amd64 #1 smp fri aug 14 07:12:04 utc 2009 i686 gnulinux '
    config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i486-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.0 -Dsitearch=/usr/local/lib/perl/5.10.0 -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 -Duseshrplib -Dlibperl=libperl.so.5.10.0 -Dd_dosuid -des'
    hint=recommended, useposix=true, d_sigaction=define
    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 -DDEBIAN -fno-strict-aliasing -pipe -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 -I/usr/local/include'
    ccversion='', gccversion='4.3.2', 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 /usr/lib64
    libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
    perllibs=-ldl -lm -lpthread -lc -lcrypt
    libc=/lib/libc-2.7.so, so=so, useshrplib=true, libperl=libperl.so.5.10.0
    gnulibc_version='2.7'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib'

Locally applied patches:
    


@INC for perl 5.10.0:
    /etc/perl
    /usr/local/lib/perl/5.10.0
    /usr/local/share/perl/5.10.0
    /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.0:
    HOME=/home/zefram
    LANG (unset)
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/home/zefram/pub/i686-pc-linux-gnu/bin:/home/zefram/pub/common/bin:/usr/bin:/usr/X11R6/bin:/bin:/usr/local/bin:/usr/games
    PERL_BADLANG (unset)
    SHELL=/usr/bin/zsh

@p5pRT
Copy link
Author

p5pRT commented Dec 6, 2009

From @davidnicol

On Mon, Nov 30, 2009 at 11​:46 AM, Zefram <perlbug-followup@​perl.org> wrote​:

Apparently, in "01.99", the "01" is being interpreted as an octal number,
and the ".99" is being interpreted as "0.99" and being passed to import.
(You can't see the effect of the 0.99 in this sequence, but it's visible
if you write your own import.)  This is unlike the parsing of "01.99"
in ordinary code, where it parses like "(01).(99)" and results in the
string "199".  It's a confusing difference.  Bug?  Not sure.

how about warning whenever dot follows an octal constant? where would
that be inserted.

This has not been tested​:

Inline Patch
diff --git a/toke.c b/toke.c
index d498a34..f5f95f5 100644
--- a/toke.c
+++ b/toke.c
@@ -2793,7 +2793,7 @@ S_scan_const(pTHX_ char *start)
                    goto default_action;
                }

-           /* eg. \132 indicates the octal constant 0x132 */
+           /* eg. \132 indicates the octal constant 0132 aka
0b001011010 aka 0x9A */   case '0'​: case '1'​: case '2'​: case '3'​:   case '4'​: case '5'​: case '6'​: case '7'​:   \{ @​@​ \-12712\,6 \+12712\,12 @​@​ Perl\_scan\_num\(pTHX\_ const char \*start\, YYSTYPE\* lvalp\)

  switch (*s) {

+ /* warning for bug #70938 */
+ case '.'​:
+ Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
+ "point parsed as end of bin/oct/hex integer");
+ /* FALL THROUGH */
+
  /* if we don't mention it, we're done */
  default​:
  goto out;

--
"The new device will also be available in blue." -- http​://➡.ws/瀲ു

@p5pRT
Copy link
Author

p5pRT commented Dec 6, 2009

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

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