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

using bignum results in Math::BigInt->bdiv deviating from specified api #12484

Open
p5pRT opened this issue Oct 13, 2012 · 5 comments
Open

using bignum results in Math::BigInt->bdiv deviating from specified api #12484

p5pRT opened this issue Oct 13, 2012 · 5 comments

Comments

@p5pRT
Copy link

p5pRT commented Oct 13, 2012

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

Searchable as RT115238$

@p5pRT
Copy link
Author

p5pRT commented Oct 13, 2012

From tom@oxix.org

Created by tom@oxix.org

The following program produces unexpected results, based on a reading
of bignum(3perl) and Math​::BigInt(3perl).

----
#!/usr/bin/perl

use strict;
use bignum;
use Math​::BigInt;

my $i = Math​::BigInt->new("12345678901234567890");
print ref($i) . "\n";
print $i->bdiv(58) . "\n";
print ref($i->bdiv(58)) . "\n";
print ref($i) . "\n";
print $i . "\n";
----

The output is​:

----
Math​::BigInt
212856532779906342.9310344827586206896552
Math​::BigFloat
Math​::BigInt
12345678901234567890
----

I would have expected bdiv() to return a Math​::BigInt, and also to
mutate the value of $i. Note that if the "use bignum" line is
commented out, it works as expected, so it possible to work around.
However, I was unable to find anything in bignum's documentation to
suggest that one should expect it to change things in this way.
With "use Math​::BigInt" commented out, the program still runs,
and the output is the unexpected version.

Perl Info

Flags:
    category=library
    severity=medium
    module=bignum

Site configuration information for perl 5.10.1:

Configured by Debian Project at Wed Dec 21 09:13:32 UTC 2011.

Summary of my perl5 (revision 5 version 10 subversion 1) configuration:
   
  Platform:
    osname=linux, osvers=2.6.32-5-amd64, archname=x86_64-linux-gnu-thread-multi
    uname='linux barber 2.6.32-5-amd64 #1 smp thu nov 3 03:41:26 utc 2011 x86_64 gnulinux '
    config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=x86_64-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=define, use64bitall=define, 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.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=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
    perllibs=-ldl -lm -lpthread -lc -lcrypt
    libc=/lib/libc-2.11.3.so, so=so, useshrplib=true, libperl=libperl.so.5.10.1
    gnulibc_version='2.11.3'
  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:fixes/safe-upgrade - http://bugs.debian.org/582978 Upgrade Safe.pm to 2.25, fixing CVE-2010-1974
    DEBPKG:fixes/tell-crash - http://bugs.debian.org/578577 [f4817f3] Fix a tell() crash on bad arguments.
    DEBPKG:fixes/format-write-crash - http://bugs.debian.org/579537 [perl #22977] [421f30e] Fix a crash in format/write
    DEBPKG:fixes/arm-alignment - http://bugs.debian.org/289884 [f1c7503] Prevent gcc from optimizing the alignment test away on armel
    DEBPKG:fixes/fcgi-test - Fix a failure in CGI/t/fast.t when FCGI is installed
    DEBPKG:fixes/hurd-ccflags - http://bugs.debian.org/587901 Make hints/gnu.sh append to $ccflags rather than overriding them
    DEBPKG:debian/squelch-locale-warnings - http://bugs.debian.org/508764 Squelch locale warnings in Debian package maintainer scripts
    DEBPKG:fixes/lc-numeric-docs - http://bugs.debian.org/379329 [perl #78452] [903eb63] LC_NUMERIC documentation fixes
    DEBPKG:fixes/lc-numeric-sprintf - http://bugs.debian.org/601549 [perl #78632] [b3fd614] Fix sprintf not to ignore LC_NUMERIC with constants
    DEBPKG:fixes/concat-stack-corruption - http://bugs.debian.org/596105 [perl #78674] [e3393f5] Fix stack pointer corruption in pp_concat() with 'use encoding'
    DEBPKG:fixes/cgi-multiline-header - http://bugs.debian.org/606995 [CVE-2010-2761 CVE-2010-4410 CVE-2010-4411] CGI.pm MIME boundary and multiline header vulnerabilities
    DEBPKG:fixes/casing-taint-cve-2011-1487 - http://bugs.debian.org/622817 [perl #87336] fix unwanted taint laundering in lc(), uc() et al.
    DEBPKG:fixes/safe-reval-rdo-cve-2010-1447 - [PATCH] Wrap by default coderefs returned by rdo and reval
    DEBPKG:fixes/encode-heap-overflow - [PATCH] Fix decode_xs n-byte heap-overflow security bug in
    DEBPKG:fixes/digest_eval_hole - Close the eval \"require $module\" security hole in
    DEBPKG:fixes/unregister_signal_handler - [PATCH] main: Unregister signal handler before destroying my_perl
    DEBPKG:patchlevel - http://bugs.debian.org/567489 List packaged patches for 5.10.1-17squeeze3 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/tom
    LANG=en_GB.utf8
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/usr/sbin:/sbin:/home/tom/bin:/home/tom/p/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
    PERL_BADLANG (unset)
    SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Oct 20, 2012

From @jkeenan

On Sat Oct 13 02​:19​:52 2012, TomJones wrote​:

The following program produces unexpected results, based on a reading
of bignum(3perl) and Math​::BigInt(3perl).

----
#!/usr/bin/perl

use strict;
use bignum;
use Math​::BigInt;

my $i = Math​::BigInt->new("12345678901234567890");
print ref($i) . "\n";
print $i->bdiv(58) . "\n";
print ref($i->bdiv(58)) . "\n";
print ref($i) . "\n";
print $i . "\n";
----

The output is​:

----
Math​::BigInt
212856532779906342.9310344827586206896552
Math​::BigFloat
Math​::BigInt
12345678901234567890
----

I would have expected bdiv() to return a Math​::BigInt, and also to
mutate the value of $i.

Can you explain what you mean by "mutate the value of $i" here?

Note that if the "use bignum" line is
commented out, it works as expected, so it possible to work around.
However, I was unable to find anything in bignum's documentation to
suggest that one should expect it to change things in this way.
With "use Math​::BigInt" commented out, the program still runs,
and the output is the unexpected version.

[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags​:
category=library
severity=medium
module=bignum
---
Site configuration information for perl 5.10.1​:

Two other informational questions​:

(1) I see from the Math​::BigInt man page that it behaves differently
whether or not you have the GMP library installed. Do you?

(2) Do you experience this problem on recent versions of Perl? (I.e.,
5.14 or 5.16; 5.10 is technically out-of-support.)

Thank you very much.
Jim Keenan

@p5pRT
Copy link
Author

p5pRT commented Oct 20, 2012

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

@p5pRT
Copy link
Author

p5pRT commented Oct 21, 2012

From @ntyni

On Sat, Oct 20, 2012 at 03​:44​:32PM -0700, James E Keenan via RT wrote​:

On Sat Oct 13 02​:19​:52 2012, TomJones wrote​:

I would have expected bdiv() to return a Math​::BigInt, and also to
mutate the value of $i.

Can you explain what you mean by "mutate the value of $i" here?

Chiming in, I'd expect it to change the value of $i, as documented​:

  $x->bdiv($y); # divide, set $x to quotient

Note that if the "use bignum" line is
commented out, it works as expected, so it possible to work around.

This is a duplicate of [perl #70109], and apparently another symptom
of [rt.cpan.org #66633].

(1) I see from the Math​::BigInt man page that it behaves differently
whether or not you have the GMP library installed. Do you?

I can reproduce it, and while I do have libgmp installed, I don't have
Math​::BigInt​::GMP. Looking at strace(1) output, I don't see any indication
that libgmp gets loaded.

(2) Do you experience this problem on recent versions of Perl? (I.e.,
5.14 or 5.16; 5.10 is technically out-of-support.)

I see it with 5.14.2 and blead (as of v5.17.5-30-gfad493e)
--
Niko Tyni ntyni@​debian.org

@p5pRT
Copy link
Author

p5pRT commented Oct 21, 2012

From tom@oxix.org

On Sat, Oct 20, 2012 at 03​:44​:31PM -0700, James E Keenan via RT wrote​:

On Sat Oct 13 02​:19​:52 2012, TomJones wrote​:

#!/usr/bin/perl

use strict;
use bignum;
use Math​::BigInt;

my $i = Math​::BigInt->new("12345678901234567890");
print ref($i) . "\n";
print $i->bdiv(58) . "\n";
print ref($i->bdiv(58)) . "\n";
print ref($i) . "\n";
print $i . "\n";
----

The output is​:

----
Math​::BigInt
212856532779906342.9310344827586206896552
Math​::BigFloat
Math​::BigInt
12345678901234567890
----

I would have expected bdiv() to return a Math​::BigInt, and also to
mutate the value of $i.

Can you explain what you mean by "mutate the value of $i" here?

Sure. The original sentence probably would have been clearer if I'd
just written "mutate $i" rather than "mutate the value of $i". I just
mean that I would expect the value of $i to change. Specifically,
according to the documentation, it should set it to the quotient​:

  $x->bdiv($y); # divide, set $x to quotient
  # return (quo,rem) or quo if scalar

However, the final line of the output shows that the value of $i in
the program has not changed. With the same program but without the
"use bignum" line, the value of $i is indeed changed, to the quotient.

Two other informational questions​:

(1) I see from the Math​::BigInt man page that it behaves differently
whether or not you have the GMP library installed. Do you?

I do have libgmp on the system, but I don't have the Math​::GMP Perl
module installed. In any case, my reading of the documentation
suggests that the presence or absence of GMP should not affect the
semantics of the public interface, of which the bdiv method is part.
If I've missed something here, please let me know.

(2) Do you experience this problem on recent versions of Perl? (I.e.,
5.14 or 5.16; 5.10 is technically out-of-support.)

I've now reproduced this on 5.14.2, the version in Debian testing.

  best wishes, Tom.

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