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() not respecting locale in 5.10+ #11049

Closed
p5pRT opened this issue Jan 18, 2011 · 16 comments
Closed

sprintf() not respecting locale in 5.10+ #11049

p5pRT opened this issue Jan 18, 2011 · 16 comments

Comments

@p5pRT
Copy link

p5pRT commented Jan 18, 2011

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

Searchable as RT82418$

@p5pRT
Copy link
Author

p5pRT commented Jan 18, 2011

From adiraj@cpan.org

Created by adiraj@cpan.org

On both 5.10.1 and 5.12.2​:

$ perl -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); print sprintf("%f",
2.5)."\n";'
2.500000

interestingly, printf() works fine​:

$ perl -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); printf("%f\n", 2.5);'
2,500000

On 5.8.8 everything works​:

$ perl -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); print sprintf("%f",
2.5)."\n";'
2,500000
$ perl -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); printf("%f\n", 2.5);'
2,500000

Perl Info

Flags:
     category=core
     severity=medium

Site configuration information for perl 5.10.1:

Configured by Debian Project at Mon Jul 12 11:18:22 UTC 2010.

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

   Platform:
     osname=linux, osvers=2.6.24-27-server, 
archname=i686-linux-gnu-thread-multi
     uname='linux rothera 2.6.24-27-server #1 smp fri mar 12 01:45:06 
utc 2010 i686 gnulinux '
     config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN 
-Dcccdlflags=-fPIC -Darchname=i686-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 -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=undef, use64bitall=undef, 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.4.4', 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 =' -fstack-protector -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.12.so, so=so, useshrplib=true, 
libperl=libperl.so.5.10.1
     gnulibc_version='2.12'
   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/501970 Raise 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/479460 Adjust 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/533707 Configure 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:patchlevel - http://bugs.debian.org/567489 List packaged 
patches for 5.10.1-12 in patchlevel.h


@INC for perl 5.10.1:
     /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/adi
     LANG=en_US.utf8
     LANGUAGE (unset)
     LD_LIBRARY_PATH (unset)
     LOGDIR (unset)
     
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/adi/bin:/home/adi/bin
     PERL_BADLANG (unset)
     SHELL=/bin/bash


@p5pRT
Copy link
Author

p5pRT commented Oct 4, 2011

From adiraj@cpan.org

Any progress on this bug? Has anyone looked at it yet?

It seems like an easy fix, so I expected it would be fixed sooner. It
was working in 5.8.8 and then broke. Should be able to just do an svn
diff of relevant code, though it should also probably get a test case added.

@p5pRT
Copy link
Author

p5pRT commented Oct 4, 2011

From [Unknown Contact. See original ticket]

Any progress on this bug? Has anyone looked at it yet?

It seems like an easy fix, so I expected it would be fixed sooner. It
was working in 5.8.8 and then broke. Should be able to just do an svn
diff of relevant code, though it should also probably get a test case added.

@p5pRT
Copy link
Author

p5pRT commented Oct 4, 2011

adiraj@cpan.org - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Oct 6, 2011

From @iabyn

On Mon, Oct 03, 2011 at 06​:31​:04PM -0700, Adi Fairbank via RT wrote​:

Any progress on this bug? Has anyone looked at it yet?

It seems like an easy fix, so I expected it would be fixed sooner. It
was working in 5.8.8 and then broke. Should be able to just do an svn
diff of relevant code, though it should also probably get a test case added.

A git bisect shows the following commit changed the behaviour​:

commit c427f4d
Author​: Nicholas Clark <nick@​ccl4.org>
Date​: Mon Feb 25 12​:48​:22 2008 +0000

  Ensure that constant folding runs with IN_PERL_RUNTIME true, by copying
  the current compiling cop to a different address. This ensures that
  lexical hints are correctly honoured, and allows us to fold sprintf.
 
  p4raw-id​: //depot/perl@​33369

--
Hofstadter's Law​: It always takes longer than you expect, even when you
take into account Hofstadter's Law.

@p5pRT
Copy link
Author

p5pRT commented Oct 6, 2011

From @ikegami

On Thu, Oct 6, 2011 at 3​:22 PM, Dave Mitchell <davem@​iabyn.com> wrote​:

A git bisect shows the following commit changed the behaviour​:

commit c427f4d
Author​: Nicholas Clark <nick@​ccl4.org>
Date​: Mon Feb 25 12​:48​:22 2008 +0000

Ensure that constant folding runs with IN_PERL_RUNTIME true, by copying
the current compiling cop to a different address. This ensures that
lexical hints are correctly honoured, and allows us to fold sprintf.

p4raw-id​: //depot/perl@​33369

Does the problem only happen in cases of constant folding? If so, it can be
worked around using

sub NO_CONST_FOLD {}
sprintf("%f", 2.5, NO_CONST_FOLD)

@p5pRT
Copy link
Author

p5pRT commented Jul 3, 2012

From @doy

If changes to the runtime environment can cause sprintf to need to
output different things, shouldn't we really just not be constant
folding sprintf?

@p5pRT
Copy link
Author

p5pRT commented Jul 3, 2012

From @cpansprout

On Mon Jul 02 20​:17​:15 2012, doy wrote​:

If changes to the runtime environment can cause sprintf to need to
output different things, shouldn't we really just not be constant
folding sprintf?

I could have sworn this was already fixed (see commit b3fd614), but it
was only fixed for ‘use locale’, not POSIX​::setlocale.

--

Father Chrysostomos

@p5pRT
Copy link
Author

p5pRT commented Jul 3, 2012

From @cpansprout

On Mon Jul 02 22​:41​:20 2012, sprout wrote​:

On Mon Jul 02 20​:17​:15 2012, doy wrote​:

If changes to the runtime environment can cause sprintf to need to
output different things, shouldn't we really just not be constant
folding sprintf?

I could have sworn this was already fixed (see commit b3fd614), but it
was only fixed for ‘use locale’, not POSIX​::setlocale.

Actually, the perllocale page seems to say that setlocale is for
switching locales at run time, but ‘use locale’ is necessary for
enabling it. It’s a bit vague, though. This is what perl actually does​:

$ ./perl -Ilib -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); print
sprintf("%f", $_=2.5)."\n";'
2,500000
$ ./perl -Ilib -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); print
sprintf("%f", 2.5)."\n";'
2.500000

--

Father Chrysostomos

@p5pRT
Copy link
Author

p5pRT commented Jun 18, 2013

From @khwilliamson

On Mon Jul 02 23​:14​:23 2012, sprout wrote​:

On Mon Jul 02 22​:41​:20 2012, sprout wrote​:

On Mon Jul 02 20​:17​:15 2012, doy wrote​:

If changes to the runtime environment can cause sprintf to need to
output different things, shouldn't we really just not be constant
folding sprintf?

I could have sworn this was already fixed (see commit b3fd614), but it
was only fixed for ‘use locale’, not POSIX​::setlocale.

Actually, the perllocale page seems to say that setlocale is for
switching locales at run time, but ‘use locale’ is necessary for
enabling it. It’s a bit vague, though. This is what perl actually does​:

$ ./perl -Ilib -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); print
sprintf("%f", $_=2.5)."\n";'
2,500000
$ ./perl -Ilib -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); print
sprintf("%f", 2.5)."\n";'
2.500000

You shouldn't expect to get locale effects outside of a 'use locale',
and I have just changed perllocale to be clear about that (I hope it's
clear anyway).

So this ticket is the complement of what it should be (in blead anyway).
The sprintf is working fine​: it should print a dot since there is no
'use locale'. If you add one, it prints the comma​:

$ blead -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2.500000
$ blead -Mlocale -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2,500000

The printf should not be printing a comma unless "use locale" is
specified, and hence, there is a bug there.

--
Karl Williamson

@p5pRT
Copy link
Author

p5pRT commented Jun 20, 2013

From adiraj@cpan.org

On Tue Jun 18 15​:54​:26 2013, khw wrote​:

On Mon Jul 02 23​:14​:23 2012, sprout wrote​:

On Mon Jul 02 22​:41​:20 2012, sprout wrote​:

On Mon Jul 02 20​:17​:15 2012, doy wrote​:

If changes to the runtime environment can cause sprintf to need to
output different things, shouldn't we really just not be constant
folding sprintf?

I could have sworn this was already fixed (see commit b3fd614),
but it
was only fixed for ‘use locale’, not POSIX​::setlocale.

Actually, the perllocale page seems to say that setlocale is for
switching locales at run time, but ‘use locale’ is necessary for
enabling it. It’s a bit vague, though. This is what perl actually
does​:

$ ./perl -Ilib -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); print
sprintf("%f", $_=2.5)."\n";'
2,500000
$ ./perl -Ilib -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); print
sprintf("%f", 2.5)."\n";'
2.500000

You shouldn't expect to get locale effects outside of a 'use locale',
and I have just changed perllocale to be clear about that (I hope it's
clear anyway).

So this ticket is the complement of what it should be (in blead anyway).
The sprintf is working fine​: it should print a dot since there is no
'use locale'. If you add one, it prints the comma​:

$ blead -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2.500000
$ blead -Mlocale -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2,500000

The printf should not be printing a comma unless "use locale" is
specified, and hence, there is a bug there.

FYI- the above does not work in perl 5.10.1 or 5.12.4​:

$ /opt/local/bin/perl -v
This is perl 5, version 12, subversion 4 (v5.12.4) built for
darwin-thread-multi-2level
[...]
$ /opt/local/bin/perl -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8");
print sprintf("%f",2.5)."\n";'
2.500000
$ /opt/local/bin/perl -Mlocale -MPOSIX -e 'setlocale(LC_NUMERIC,
"fr_FR.utf8"); print sprintf("%f",2.5)."\n";'
2.500000

$ perl -v
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
[...]
$ perl -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2.500000
$ perl -Mlocale -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2.500000

@p5pRT
Copy link
Author

p5pRT commented Jun 20, 2013

From [Unknown Contact. See original ticket]

On Tue Jun 18 15​:54​:26 2013, khw wrote​:

On Mon Jul 02 23​:14​:23 2012, sprout wrote​:

On Mon Jul 02 22​:41​:20 2012, sprout wrote​:

On Mon Jul 02 20​:17​:15 2012, doy wrote​:

If changes to the runtime environment can cause sprintf to need to
output different things, shouldn't we really just not be constant
folding sprintf?

I could have sworn this was already fixed (see commit b3fd614),
but it
was only fixed for ‘use locale’, not POSIX​::setlocale.

Actually, the perllocale page seems to say that setlocale is for
switching locales at run time, but ‘use locale’ is necessary for
enabling it. It’s a bit vague, though. This is what perl actually
does​:

$ ./perl -Ilib -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); print
sprintf("%f", $_=2.5)."\n";'
2,500000
$ ./perl -Ilib -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); print
sprintf("%f", 2.5)."\n";'
2.500000

You shouldn't expect to get locale effects outside of a 'use locale',
and I have just changed perllocale to be clear about that (I hope it's
clear anyway).

So this ticket is the complement of what it should be (in blead anyway).
The sprintf is working fine​: it should print a dot since there is no
'use locale'. If you add one, it prints the comma​:

$ blead -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2.500000
$ blead -Mlocale -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2,500000

The printf should not be printing a comma unless "use locale" is
specified, and hence, there is a bug there.

FYI- the above does not work in perl 5.10.1 or 5.12.4​:

$ /opt/local/bin/perl -v
This is perl 5, version 12, subversion 4 (v5.12.4) built for
darwin-thread-multi-2level
[...]
$ /opt/local/bin/perl -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8");
print sprintf("%f",2.5)."\n";'
2.500000
$ /opt/local/bin/perl -Mlocale -MPOSIX -e 'setlocale(LC_NUMERIC,
"fr_FR.utf8"); print sprintf("%f",2.5)."\n";'
2.500000

$ perl -v
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
[...]
$ perl -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2.500000
$ perl -Mlocale -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2.500000

@p5pRT
Copy link
Author

p5pRT commented Jun 20, 2013

From @jkeenan

On Thu Jun 20 09​:38​:41 2013, adi wrote​:

On Tue Jun 18 15​:54​:26 2013, khw wrote​:

On Mon Jul 02 23​:14​:23 2012, sprout wrote​:

On Mon Jul 02 22​:41​:20 2012, sprout wrote​:

On Mon Jul 02 20​:17​:15 2012, doy wrote​:

If changes to the runtime environment can cause sprintf to need to
output different things, shouldn't we really just not be constant
folding sprintf?

I could have sworn this was already fixed (see commit b3fd614),
but it
was only fixed for ‘use locale’, not POSIX​::setlocale.

Actually, the perllocale page seems to say that setlocale is for
switching locales at run time, but ‘use locale’ is necessary for
enabling it. It’s a bit vague, though. This is what perl actually
does​:

$ ./perl -Ilib -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); print
sprintf("%f", $_=2.5)."\n";'
2,500000
$ ./perl -Ilib -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); print
sprintf("%f", 2.5)."\n";'
2.500000

You shouldn't expect to get locale effects outside of a 'use locale',
and I have just changed perllocale to be clear about that (I hope it's
clear anyway).

So this ticket is the complement of what it should be (in blead anyway).
The sprintf is working fine​: it should print a dot since there is no
'use locale'. If you add one, it prints the comma​:

$ blead -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2.500000
$ blead -Mlocale -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2,500000

The printf should not be printing a comma unless "use locale" is
specified, and hence, there is a bug there.

FYI- the above does not work in perl 5.10.1 or 5.12.4​:

$ /opt/local/bin/perl -v
This is perl 5, version 12, subversion 4 (v5.12.4) built for
darwin-thread-multi-2level
[...]
$ /opt/local/bin/perl -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8");
print sprintf("%f",2.5)."\n";'
2.500000
$ /opt/local/bin/perl -Mlocale -MPOSIX -e 'setlocale(LC_NUMERIC,
"fr_FR.utf8"); print sprintf("%f",2.5)."\n";'
2.500000

$ perl -v
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
[...]
$ perl -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2.500000
$ perl -Mlocale -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2.500000

What I got with blead​:

#####
$ ./perl -v
This is perl 5, version 19, subversion 1 (v5.19.1
(v5.19.0-609-g28371e3)) built for x86_64-linux

$ ./perl -Ilib -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8");print
sprintf("%f",2.5)."\n";'
2.500000

$ ./perl -Ilib -Mlocale -MPOSIX -e 'setlocale(LC_NUMERIC,
"fr_FR.utf8");print sprintf("%f",2.5)."\n";'
2,500000
#####

@p5pRT
Copy link
Author

p5pRT commented Jun 22, 2013

From adi@adiraj.org

On Jun 18, 2013, at 3​:54 PM, Karl Williamson via RT wrote​:

On Mon Jul 02 23​:14​:23 2012, sprout wrote​:

On Mon Jul 02 22​:41​:20 2012, sprout wrote​:

On Mon Jul 02 20​:17​:15 2012, doy wrote​:

If changes to the runtime environment can cause sprintf to need to
output different things, shouldn't we really just not be constant
folding sprintf?

I could have sworn this was already fixed (see commit b3fd614), but it
was only fixed for ‘use locale’, not POSIX​::setlocale.

Actually, the perllocale page seems to say that setlocale is for
switching locales at run time, but ‘use locale’ is necessary for
enabling it. It’s a bit vague, though. This is what perl actually does​:

$ ./perl -Ilib -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); print
sprintf("%f", $_=2.5)."\n";'
2,500000
$ ./perl -Ilib -MPOSIX -e 'setlocale(LC_ALL, "nl_NL"); print
sprintf("%f", 2.5)."\n";'
2.500000

You shouldn't expect to get locale effects outside of a 'use locale',
and I have just changed perllocale to be clear about that (I hope it's
clear anyway).

So this ticket is the complement of what it should be (in blead anyway).
The sprintf is working fine​: it should print a dot since there is no
'use locale'. If you add one, it prints the comma​:

$ blead -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2.500000
$ blead -Mlocale -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print
sprintf("%f",2.5)."\n";'
2,500000

FYI- the above does not work in perl 5.10.1 or 5.12.4​:

$ /opt/local/bin/perl -v
This is perl 5, version 12, subversion 4 (v5.12.4) built for darwin-thread-multi-2level
[...]
$ /opt/local/bin/perl -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print sprintf("%f",2.5)."\n";'
2.500000
$ /opt/local/bin/perl -Mlocale -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print sprintf("%f",2.5)."\n";'
2.500000

$ perl -v
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
[...]
$ perl -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print sprintf("%f",2.5)."\n";'
2.500000
$ perl -Mlocale -MPOSIX -e 'setlocale(LC_NUMERIC, "fr_FR.utf8"); print sprintf("%f",2.5)."\n";'
2.500000

Adi

@p5pRT
Copy link
Author

p5pRT commented Dec 10, 2013

From @khwilliamson

This ticket could be rejected because the behavior it describes is not a bug. Perl is designed to not use locale information except within the scope of 'use locale'. However, an example in the discussion that ensued showed a bug where not being in 'use locale' was not respected, so the bug report has been left open But it turns out that this bug has been fixed by commit e46375f
  Author​: Karl Williamson <public@​khwilliamson.com>
  Date​: Sat Aug 24 12​:59​:46 2013 -0600

  Make printf, sprintf respect 'use locale' for radix


Karl Williamson

@p5pRT
Copy link
Author

p5pRT commented Dec 10, 2013

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

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

1 participant