まつもと ゆきひろです

In message "Re: [ruby-dev:37959] [Bug:trunk] I can modify literals"
    on Wed, 11 Feb 2009 02:16:05 +0900, Yusuke ENDOH <mame / tsg.ne.jp> writes:

|ObjectSpace を使うと種々のリテラルを書き換えることができてしまうようですが、
|仕様でしょうか。

うーん、ObjectSpaceってのはかなり裏技なんで、それを使って
「まずいこと」ができた場合、それを仕様と呼ぶのもバグと呼ぶの
も抵抗があります。

|バグだとして、リテラルを freeze するパッチを書きましたが、IRC では
|
|  - freeze で解決するのが正しいやり方なのか
|  - freeze しても finalizer が付け替えできるのではないか
|
|という感じの指摘がありました。どう直すのがよいでしょう。

後者はうささんに直してもらいました。前者については

  * ObjectSpaceは裏技。やる方が悪い(からバグじゃない)
  * 禁止できるものなら禁止した方がよい(からバグ)

の両方の考え方ができると思います。

....

いろいろ考えましたが、過去にもObjectSpaceの「まずいこと」に
手当てしてきた経緯がありますし、バグとみなすことにします。で、
その場合の修正方法ですが、freezeで構わないと思います。

パッチをコミットしてください。