Project

General

Profile

Actions

Bug #8204

closed

ObjectSpace.each_object(Bignum) can generate Bignums that are to small to be Bignums

Added by Hanmac (Hans Mackowiak) almost 11 years ago. Updated almost 11 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 2.1.0dev (2013-04-02 trunk 40068) [x86_64-linux]
Backport:
[ruby-core:53893]

Description

when i do:

p ObjectSpace.each_object(Bignum).to_a
=> [18446744073709551615, 3, 2394213621560389257607583714845333205]
and again:
ObjectSpace.each_object(Bignum).to_a
=> [18446744073709551615, 3, 63326588221939058800767348888534802301, 0, 0, 0]

my question: why does the 3 and the zeros show up?

n = ObjectSpace.each_object(Bignum).min #=> 0
p n.class #Bignum
p n.zero? #=> false
p n < 0 # true

okay this means i have a zero, that looks like zero, but is not a zero and its class is Bignum

(but when i try in a new ruby session)

(2**64) < 0;
p bigZero = ObjectSpace.each_object(Bignum).min #=> 0
p bigZero.class #Bignum
p bigZero.zero? #=> true

okay, this time i get a zero that looks like a zero, and react like a zero, but its still a Bignum

so where does the zeros come from and why does they react so totaly different?

Updated by hsbt (Hiroshi SHIBATA) almost 11 years ago

  • Category set to core
  • Assignee set to ko1 (Koichi Sasada)
  • Target version set to 2.1.0

Updated by Anonymous almost 11 years ago

Note that you can obtain whichever Bignum you want using coerce. For
example:

x = (1 << 100).coerce(42).first # => 42
x.class # => Bignum

I saw that used in test/*

I never bothered to investigate it, but I'm pretty sure this could lead to
multiple bugs as MRI assumes that Bignum means big number in many places.

Actions #3

Updated by nobu (Nobuyoshi Nakada) almost 11 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r40076.
Hans, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


bignum.c: Bignum zero comparison

  • bignum.c (rb_big_eq): test as Fixnum if possible and get rid of zero
    length Bignum. [ruby-core:53893] [Bug #8204]

Updated by Hanmac (Hans Mackowiak) almost 11 years ago

okay that solvs a bit, so the generated Bignums are zero too,
but for sample

ObjectSpace.each_object(Bignum).select &:zero?

still generates Bignum zeros and the 3 that was inside the Bignum list at the beginning confuses me

Updated by nobu (Nobuyoshi Nakada) almost 11 years ago

x = (1 << 100).coerce(42).first # => 42
x.class # => Bignum

It's a Feature.

Numeric#coerce must return a pair of converted interoperable values.

In future version, Fixnum and Bignum might be merged.
However, these commits do not intend it.
Just fixes the comparison, and hides and frees intermediate objects earlier.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0