Project

General

Profile

Actions

Backport #6605

closed

Rational#round causes irb to crash when given a reasonably absurd precision value

Added by jfredett (Joe Fredette) over 12 years ago. Updated over 12 years ago.

Status:
Closed
[ruby-core:45707]

Description

Reproduction steps:

  1. Open up an IRB, I'm using 1.9.3-p290 (see [1] for the ruby -v output)

  2. Enter: Rational(1,2).round(2_097_171) into IRB

  3. Notice the following stacktrace

1.9.3-p125-perf :001 > Rational(1,2).round(2_097_171)
(irb):1: warning: in a**b, b may be too big
(irb):1: [BUG] Segmentation fault
ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin10.8.0]

-- Control frame information -----------------------------------------------
c:0024 p:---- s:0086 b:0086 l:000085 d:000085 CFUNC :round
c:0023 p:0021 s:0082 b:0082 l:002688 d:000081 EVAL (irb):1
c:0022 p:---- s:0080 b:0080 l:000079 d:000079 FINISH
c:0021 p:---- s:0078 b:0078 l:000077 d:000077 CFUNC :eval
c:0020 p:0028 s:0071 b:0071 l:000070 d:000070 METHOD /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/ir
b/workspace.rb:80
c:0019 p:0033 s:0064 b:0063 l:000062 d:000062 METHOD /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/ir
b/context.rb:254
c:0018 p:0031 s:0058 b:0058 l:0024d8 d:000057 BLOCK /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/ir
b.rb:159
c:0017 p:0042 s:0050 b:0050 l:000049 d:000049 METHOD /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/ir
b.rb:273
c:0016 p:0011 s:0045 b:0045 l:0024d8 d:000044 BLOCK /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/ir
b.rb:156
c:0015 p:0144 s:0041 b:0041 l:000024 d:000040 BLOCK /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/ir
b/ruby-lex.rb:243
c:0014 p:---- s:0038 b:0038 l:000037 d:000037 FINISH
c:0013 p:---- s:0036 b:0036 l:000035 d:000035 CFUNC :loop
c:0012 p:0009 s:0033 b:0033 l:000024 d:000032 BLOCK /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/ir
b/ruby-lex.rb:229
c:0011 p:---- s:0031 b:0031 l:000030 d:000030 FINISH
c:0010 p:---- s:0029 b:0029 l:000028 d:000028 CFUNC :catch
c:0009 p:0023 s:0025 b:0025 l:000024 d:000024 METHOD /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/ir
b/ruby-lex.rb:228
c:0008 p:0046 s:0022 b:0022 l:0024d8 d:0024d8 METHOD /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/ir
b.rb:155
c:0007 p:0011 s:0019 b:0019 l:001a58 d:000018 BLOCK /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/ir
b.rb:70
c:0006 p:---- s:0017 b:0017 l:000016 d:000016 FINISH
c:0005 p:---- s:0015 b:0015 l:000014 d:000014 CFUNC :catch
c:0004 p:0183 s:0011 b:0011 l:001a58 d:001a58 METHOD /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/ir
b.rb:69
c:0003 p:0142 s:0006 b:0006 l:0009b8 d:0008d8 EVAL /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/bin/irb:16
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH
c:0001 p:0000 s:0002 b:0002 l:0009b8 d:0009b8 TOP

-- Ruby level backtrace information ----------------------------------------
/Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/bin/irb:16:in <main>' /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb.rb:69:in start'
/Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb.rb:69:in catch' /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb.rb:70:in block in start'
/Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb.rb:155:in eval_input' /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in each_top_level_statement'
/Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in catch'/Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in block in each_top_level_stateme
nt'
/Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in loop' /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/ruby-lex.rb:243:in block (2 levels) in each_top_le
vel_statement'
/Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb.rb:156:in block in eval_input' /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb.rb:273:in signal_status'
/Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb.rb:159:in block (2 levels) in eval_input' /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/context.rb:254:in evaluate'
/Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/workspace.rb:80:in evaluate' /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/workspace.rb:80:in eval'
(irb):1:in irb_binding' (irb):1:in round'

-- C level backtrace information -------------------------------------------

See Crash Report log file under ~/Library/Logs/CrashReporter or
/Library/Logs/CrashReporter, for the more detail of.

-- Other runtime information -----------------------------------------------

  • Loaded script: irb

  • Loaded features:

    0 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/x86_64-darwin10.8.0/enc/encdb.bundle 1 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/x86_64-darwin10.8.0/enc/trans/transdb.bundle
    2 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb.rb
    3 /Users/jfredett/.rvm/scripts/irbrc.rb
    4 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/extend-command.rb
    5 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/input-method.rb
    6 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/output-method.rb
    7 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/workspace.rb
    8 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/locale.rb
    9 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/magic-file.rb
    10 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/x86_64-darwin10.8.0/readline.bundle
    11 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb
    12 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/site_ruby/1.9.1/rubygems/deprecate.rb
    13 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/x86_64-darwin10.8.0/rbconfig.rb
    14 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/src_encoding.rb 15 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/site_ruby/1.9.1/rubygems/platform.rb
    16 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/ruby-token.rb
    17 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/site_ruby/1.9.1/rubygems/version.rb
    18 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb
    19 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/completion.rb
    20 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/e2mmap.rb
    21 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/notifier.rb
    22 enumerator.so
    23 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/inspector.rb
    24 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/site_ruby/1.9.1/rubygems.rb
    25 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/site_ruby/1.9.1/rubygems/exceptions.rb
    26 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/site_ruby/1.9.1/rubygems/defaults.rb 27 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/init.rb
    28 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/site_ruby/1.9.1/rubygems/requirement.rb
    29 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/site_ruby/1.9.1/rubygems/path_support.rb
    30 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/context.rb
    31 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/ruby-lex.rb
    32 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/1.9.1/irb/slex.rb
    33 /Users/jfredett/.rvm/rubies/ruby-1.9.3-p125-perf/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

Abort trap

============

I haven't tried recreating this in a ruby script yet, just in IRB. Attached is my OSX crashlog.

I'll note that it doesn't seem to crash for large negative exponents, but it does go very slowly
(and with an exponent of ~ -2_900_000, it seems to hang and lock up the CPU on my i7 3ghz)

I think it's safe to say this is a pretty extreme edgecase. I only ran across it via some morbid
curiosity while implementing Rational#round in Rubinius.

[1] output of ruby -v : ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin10.8.0]

[2] output of uname -a : Darwin jgf.home 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:32:41 PDT 2011; root:xnu-1504.15.3~1/RELEASE_X86_64 x86_64 i386 MacBookPro8,2 Darwin


Related issues 1 (0 open1 closed)

Related to Ruby master - Feature #3429: Integer#**(large) warns "in a**b, b may be too big" and return InfinityClosedmrkn (Kenta Murata)06/11/2010Actions

Updated by drbrain (Eric Hodel) over 12 years ago

  • Category set to core
  • Assignee set to naruse (Yui NARUSE)
  • Target version set to 1.9.3

This does not occur in trunk.

I applied r35081 to 1_9_3 branch locally and the bug disappears, so I think a backport will fix it.

Actions #2

Updated by nobu (Nobuyoshi Nakada) over 12 years ago

  • Target version deleted (1.9.3)
  • Tracker changed from Bug to Backport
  • Project changed from Ruby master to Backport193
  • Category deleted (core)
Actions #3

Updated by naruse (Yui NARUSE) over 12 years ago

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

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


merge revision(s) 35081: [Backport #6605]

* bignum.c (rb_big_pow): estimate result bit size more precisely.
  [ruby-core:30735][Feature #3429]
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0