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

sprintf ignores LC_NUMERIC when folding constants #10769

Closed
p5pRT opened this issue Oct 27, 2010 · 5 comments
Closed

sprintf ignores LC_NUMERIC when folding constants #10769

p5pRT opened this issue Oct 27, 2010 · 5 comments

Comments

@p5pRT
Copy link

p5pRT commented Oct 27, 2010

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

Searchable as RT78632$

@p5pRT
Copy link
Author

p5pRT commented Oct 27, 2010

From @ntyni

This is a bug report for perl from Niko Tyni <ntyni@​debian.org>,
generated with the help of perlbug 1.39 running under perl 5.13.6.


Commit c427f4d in 5.10.1 made sprintf()
ignore LC_NUMERIC with numeric constants.

perl -Mlocale -MPOSIX=locale_h -e 'setlocale(LC_NUMERIC, "fi_FI") or die; printf("%s should be %g\n", sprintf("%g", 2.4), 2.4)'
2.4 should be 2,4

(At least de_DE and sv_SE should also do for the locale.)

The bug is with constant folding, this works​:

perl -Mlocale -MPOSIX=locale_h -e 'setlocale(LC_NUMERIC, "fi_FI") or die; $in = 2.4; printf("%s should be %g\n", sprintf("%g", $in), 2.4)'
2,4 should be 2,4

Proposed patch attached, including a regression test. The test requires
the patches from [perl #78452] to be applied first.



Flags​:
  category=core
  severity=low


Site configuration information for perl 5.13.6​:

Configured by niko at Tue Oct 26 23​:55​:38 EEST 2010.

Summary of my perl5 (revision 5 version 13 subversion 6) configuration​:
  Derived from​: c0507bfdd88c7b40e0351f57671bf37465c9fbdb
  Ancestor​: 07be2ac
  Platform​:
  osname=linux, osvers=2.6.32-5-amd64, archname=x86_64-linux-gnu-thread-multi
  uname='linux madeleine 2.6.32-5-amd64 #1 smp wed oct 20 00​:05​:22 utc 2010 x86_64 gnulinux '
  config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.13 -Darchlib=/usr/lib/perl/5.13 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.13.6 -Dsitearch=/usr/local/lib/perl/5.13.6 -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=both -Doptimize=-O0 -Dusedevel -Uuseshrplib -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 -DDEBUGGING -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
  optimize='-O0 -g',
  cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -DDEBUGGING -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
  ccversion='', gccversion='4.4.5', 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 /usr/lib /lib64 /usr/lib64
  libs=-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc -lgdbm_compat
  perllibs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
  libc=/lib/libc-2.11.2.so, so=so, useshrplib=false, libperl=libperl.a
  gnulibc_version='2.11.2'
  Dynamic Linking​:
  dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
  cccdlflags='-fPIC', lddlflags='-shared -O0 -g -L/usr/local/lib -fstack-protector'

Locally applied patches​:
 


@​INC for perl 5.13.6​:
  lib
  /usr/local/lib/perl/5.13.6
  /usr/local/share/perl/5.13.6
  /usr/lib/perl5
  /usr/share/perl5
  /usr/lib/perl/5.13
  /usr/share/perl/5.13
  /usr/local/share/perl
  /usr/share/perl5
  .


Environment for perl 5.13.6​:
  HOME=/home/niko
  LANG=en_US.UTF-8
  LANGUAGE (unset)
  LC_CTYPE=fi_FI.UTF-8
  LD_LIBRARY_PATH (unset)
  LOGDIR (unset)
  PATH=/home/niko/bin​:/home/niko/bin​:/home/niko/bin​:/usr/local/bin​:/usr/bin​:/bin​:/usr/local/games​:/usr/games​:/sbin​:/usr/sbin​:/sbin​:/usr/sbin
  PERL_BADLANG (unset)
  SHELL=/bin/zsh

@p5pRT
Copy link
Author

p5pRT commented Oct 27, 2010

From @ntyni

0001-Don-t-fold-constants-in-sprintf-if-locales-are-used.patch
From 7e37740c88629b397d90d5fbf7e8b2a66fe1bc16 Mon Sep 17 00:00:00 2001
From: Niko Tyni <ntyni@debian.org>
Date: Wed, 27 Oct 2010 10:56:24 +0300
Subject: [PATCH] Don't fold constants in sprintf() if locales are used

Commit c427f4d2d4575fbc8a5190932fe321136c7597b3 in 5.10.1 made sprintf()
ignore LC_NUMERIC for numeric constants.
---
 op.c           |    1 +
 t/run/locale.t |   15 ++++++++++++++-
 2 files changed, 15 insertions(+), 1 deletions(-)

diff --git a/op.c b/op.c
index cfa9d6b..615678e 100644
--- a/op.c
+++ b/op.c
@@ -2588,6 +2588,7 @@ S_fold_constants(pTHX_ register OP *o)
     case OP_SLE:
     case OP_SGE:
     case OP_SCMP:
+    case OP_SPRINTF:
 	/* XXX what about the numeric ops? */
 	if (PL_hints & HINT_LOCALE)
 	    goto nope;
diff --git a/t/run/locale.t b/t/run/locale.t
index 483123f..2f7306b 100644
--- a/t/run/locale.t
+++ b/t/run/locale.t
@@ -128,6 +128,19 @@ EOF
 	    "too late to ignore the locale at write() time");
         }
     }
+
+    for ($different) {
+	local $ENV{LC_NUMERIC} = $_;
+	local $ENV{LC_ALL}; # so it never overrides LC_NUMERIC
+	fresh_perl_is(<<'EOF', "$difference "x4, {},
+	    use locale;
+	    use POSIX qw(locale_h);
+	    setlocale(LC_NUMERIC, "");
+	    my $in = 4.2;
+	    printf("%g %g %s %s ", $in, 4.2, sprintf("%g", $in), sprintf("%g", 4.2));
+EOF
+	"sprintf() and printf() look at LC_NUMERIC regardless of constant folding");
+    }
 } # SKIP
 
-sub last { 6 }
+sub last { 7 }
-- 
1.7.2.3

@p5pRT
Copy link
Author

p5pRT commented Oct 27, 2010

From @cpansprout

On Wed Oct 27 01​:14​:11 2010, ntyni@​debian.org wrote​:

Proposed patch attached, including a regression test. The test
requires
the patches from [perl #78452] to be applied first.

Thank you. Applied as b3fd614.

@p5pRT
Copy link
Author

p5pRT commented Oct 27, 2010

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

@p5pRT
Copy link
Author

p5pRT commented Oct 27, 2010

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant