Backport #1329

Ruby 1.8.8 で "p eval('0' + '+0.1'*n)" が Segmentation Fault を発生させる

Added by mrkn (Kenta Murata) about 3 years ago. Updated about 1 year ago.

Status:Assigned Start date:03/30/2009
Priority:Normal Due date:
Assignee:wyhaines (Kirk Haines) % Done:

100%

Category:-
Target version:-

Description

"p eval('0' + '+0.1'*n)" を評価すると、
n がある値 N1 を超えたときに TypeError が、
N2 を超えたときに Segmentation Fault が発生します。
N1 と N2 がアーキテクチャに依存するかどうかは調べてません。

  $ ~/ruby-1.8.8-r23009/bin/ruby -ve "p eval('0'+'+0.1'*4581)"
  ruby 1.8.8dev (2009-03-19) [i386-darwin9.6.0]
  458.100000000036
  $ ~/ruby-1.8.8-r23009/bin/ruby -ve "p eval('0'+'+0.1'*4582)"
  ruby 1.8.8dev (2009-03-19) [i386-darwin9.6.0]
  -e:1: can't modify frozen string (TypeError)
  $ ~/ruby-1.8.8-r23009/bin/ruby -ve "p eval('0'+'+0.1'*5132)"
  ruby 1.8.8dev (2009-03-19) [i386-darwin9.6.0]
  -e:1: can't modify frozen string (TypeError)
  $ ~/ruby-1.8.8-r23009/bin/ruby -ve "p eval('0'+'+0.1'*5133)"
  ruby 1.8.8dev (2009-03-19) [i386-darwin9.6.0]
  Segmentation fault

eval しなければ TypeError も SEGV も発生しないことは確認済です。

  $ ~/ruby-1.8.8-r23009/bin/ruby -ve "'0'+'+0.1'*5133"
  ruby 1.8.8dev (2009-03-19) [i386-darwin9.6.0]
  -e:1: warning: useless use of + in void context

Associated revisions

Revision 23096
Added by nobu about 3 years ago

* eval.c (rb_eval): checks for interrupt, stack and finalizers too. [ruby-dev:38208], [Bug #1329] * eval.c (eval): replaces the message if frozen.

History

Updated by mrkn (Kenta Murata) about 3 years ago

古いリビジョンで試していたことに気付いて、最新のリビジョンでもう一度やってみました。
その結果、以下に示すように、症状は変わっていませんでした。

  $ ~/ruby-1.8.8-r23088/bin/ruby -ve "p eval('0'+'+0.1'*4581)"
  ruby 1.8.8dev (2009-03-28) [i386-darwin9.6.0]
  458.100000000036
  $ ~/ruby-1.8.8-r23088/bin/ruby -ve "p eval('0'+'+0.1'*4582)"
  ruby 1.8.8dev (2009-03-28) [i386-darwin9.6.0]
  -e:1: can't modify frozen string (TypeError)
  $ ~/ruby-1.8.8-r23088/bin/ruby -ve "p eval('0'+'+0.1'*5132)"
  ruby 1.8.8dev (2009-03-28) [i386-darwin9.6.0]
  -e:1: can't modify frozen string (TypeError)
  $ ~/ruby-1.8.8-r23088/bin/ruby -ve "p eval('0'+'+0.1'*5133)"
  ruby 1.8.8dev (2009-03-28) [i386-darwin9.6.0]
  Segmentation fault

  $ ~/ruby-1.8.8-r23088/bin/ruby -ve "'0'+'+0.1'*5133"
  ruby 1.8.8dev (2009-03-28) [i386-darwin9.6.0]
  -e:1: warning: useless use of + in void context

Updated by nobu (Nobuyoshi Nakada) about 3 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100
Applied in changeset r23096.

Updated by shyouhei (Shyouhei Urabe) about 3 years ago

  • Status changed from Closed to Open
  • Assignee set to shyouhei (Shyouhei Urabe)

Updated by shyouhei (Shyouhei Urabe) almost 3 years ago

  • Assignee changed from shyouhei (Shyouhei Urabe) to wyhaines (Kirk Haines)
1.8.6 also has this problem.

Updated by shyouhei (Shyouhei Urabe) over 1 year ago

  • Status changed from Open to Assigned

Also available in: Atom PDF