けいじゅ@ラショナルソフトウェアです. In [ruby-dev:19994] the message: "[ruby-dev:19994] Re: I quote: "Maybe IRB bug!!"", on Apr/10 13:15(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >私のところだと、$SAFE=1ならいろいろできるんですが、$SAFE=4に >するとしたとたんSecurityErrorで落ちます。 色々できるって? $SAFE=1した後も, irb上でメソッドが実行できるってこと? >でも固まったりはしないなあ。 同じく... >|b = proc{bind} >|eval "$SAFE = 1", b >|p $SAFE >|#=> 1 >意図通りです。これは「Procの中」ではありませんから。一方、 静的に中ってこと? > e = proc{|x| eval x} > e.call("$SAFE=1") > p $SAFE #=> 0 > >になります。もっとも、これは毎回リセットされちゃいますね。 > > p e.call("$SAFE") #=> 0 > >これはリセットされないようにするべきなのかなあ。 リセットされないと, 2度目から実行(eval)できないのでは? と思ったけど, proc{$SAFE=1; eval "puts $SAFE"}.call とか proc{$SAFE=1; eval "gets"}.call がエラーにならないのは正常の動作? # rubyのセキュリティモデルは難しい... >現状では$SAFEの状態を保存しても動くようにしようと思ったら、Threadを別 >に作るしかないみたいですね。 うーん. こっちでは難しそう... irbは一行一行evalしたいわけですよね. evalはThread内で実行しなくてはな らないので, そうすると$SAFE>1でエラーになってしまう... でも, $SAFE>1でirbを実行したいってニーズはあんまりないと思いますので, 無理して実行できるように対応する気はあまりないですが. __ ..................................石塚 圭樹@ラショナルソフトウェア... ----------------------------------->> e-mail: keiju / rational.com <<---