読者です 読者をやめる 読者になる 読者になる

RubyのSymbol GCの翻訳記事が良い

ruby

(翻訳) Ruby 2.2 のシンボル GC | FIVETEESIXONE

この翻訳記事が良かったです。
RubyのSymbolの問題は、Rails の security update の内容などを何度か見て知ってはいたのですが
仕組みについては知りませんでした。

対応方法

Narihiro Nakamura は、この問題への回避策として、 C の世界の「Immortal Symbol (不死のシンボル)」と 
Ruby の世界の「Mortal Symbol (死ぬ運命にあるシンボル)」を区別するというアイデアを提唱しました。
基本的に、Ruby の実行時に (to_sym などによって) 動的に生成されるすべてのシンボルは、
ガーベージコレクションの対象とすることができます。その理由は、
それらのシンボルが Ruby インタプリタの内部で利用されることはないためです。
一方、新しいメソッドの定義によって作られたシンボルや、
静的にコードの中で定義されているシンボルはガーベージコレクションの対象とはなりません。
例えば、:foo と def foo; end はどちらもガーベージコレクションの対象となりませんが、
"foo".to_sym はガーベージコレクションの対象になります。

注意すべき点

(あんまりないでしょうが)メソッド定義と変数については、
GC対象にならないため、これらについては注意が必要。

  • ユーザーの入力に基づいてランダムなメソッドを定義すること
  • ユーザーの入力に基づいて変数を作成すること