RubyのSymbol GCの翻訳記事が良い
(翻訳) 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対象にならないため、これらについては注意が必要。
- ユーザーの入力に基づいてランダムなメソッドを定義すること
- ユーザーの入力に基づいて変数を作成すること