Bug in Bignum.to_s (1.8.6 only)


#1

Hello all,

Just making a quick note of a bug we found in Bignum.to_s in Ruby 1.8.6,
in case it burns anyone else.

Examples:

irb(main):001:0> 18446744073709551615.to_s(36) # should be
“3w5e11264sgsf”
=> “w5e11264sgsf”
irb(main):002:0> -18446744073709551615.to_s(8) # should be
“-1777777777777777777777”
=> “11777777777777777777777”

The bug affects bases 8, 9, and 32-36 inclusive, over certain ranges of
values depending on the base. Values immediately less than 264 seem to
be particularly affected. For example, in base 36, all values from
4738381338321616896 through 18446744073709551615 (which is 2
64-1) will
fail.

It manifests only in Ruby 1.8.6. Ruby 1.8.5 works correctly. (It appears
that some optimization work went a little too far.)

For anyone affected by this, I filed the bug on RubyForge, and posted a
possible “works for me, but use at your own risk” fix to bignum.c:

http://rubyforge.org/tracker/?func=detail&aid=9410&group_id=426&atid=1698

Cheers,
Daniel A.
Chief Architect, Zoodango.com


#2

On Mar 31, 1:27 pm, Daniel A. removed_email_address@domain.invalid wrote:

irb(main):002:0> -18446744073709551615.to_s(8) # should be
that some optimization work went a little too far.)

Posted viahttp://www.ruby-forum.com/.

I have verified that the bignum bug you described also occurs in ruby
1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]

C:\Documents and Settings\Owner>irb
irb(main):001:0> 18446744073709551615.to_s
=> “18446744073709551615”
irb(main):002:0> 18446744073709551615.to_s(32)
=> “vvvvvvvvvvvv”
irb(main):003:0> 18446744073709551616.to_s(32)
=> “g000000000000”
irb(main):004:0> 18446744073709551615.to_s(36)
=> “w5e11264sgsf”
irb(main):005:0> 18446744073709551616.to_s(36)
=> “3w5e11264sgsg”
irb(main):006:0> 18446744073709551615.to_s(31)
=> “nd075ib45k86f”
irb(main):007:0> 18446744073709551616.to_s(31)
=> “nd075ib45k86g”


#3

bbiker wrote:

I have verified that the bignum bug you described also occurs in ruby
1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]

Actually, to clarify, the 1.8.6 releases are the ONLY released version
I’m aware of that exhibits the bug. (1.8.5 and earlier do not appear to
be affected, so far as I know.) But thanks for verifying. :slight_smile:

Daniel


#4

Begin forwarded message: