Issue #6605 has been reported by jfredett (Joe Fredette).

----------------------------------------
Bug #6605: Rational#round causes irb to crash when given a reasonably absurd precision value
https://bugs.ruby-lang.org/issues/6605

Author: jfredett (Joe Fredette)
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v:  ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin10.8.0] 


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


-- 
http://bugs.ruby-lang.org/