eval蹂躙
Rubyのmainについて議論をまとめてみます(一方的に教わっただけとも言う)
- RubyのTopLevelはmainというObjectとして実行される(p selfすれば分かる)
- Objectなので@hogeとかするとインスタンス変数を宣言もできる
- 自分でdefして作ったメソッドはmainのprivate_methodとして追加されている
- mainにはKernelモジュールがMix-inされている
ここで、Kernelモジュールの関数を上書きしてしまうとその動作を変更することができて
便利です。しかも100%全員が読むことが決定している訳です(mainを呼ばないRubyプログラムは存在しない)
ここでevalを上書きしてしまえばリーダーマクロもどきがきっとできる
というわけです。その前段階として、evalを乗っ取ってみます。
module Kernel alias :eval_old :eval def eval(str) puts "らめぇ" eval_old str end end eval "puts 'hogehogehoge'"
それでは早速実行。
ターミナルから実行します。
良い子はirb使った方が良いでしょう。
[sakura@Pachouli]$ruby eval.rb らめぇ hogehogehoge
すばらしいですね。
evalを書き換えることができました。
これでstrを自分の思い通りに書き換えてあげれば
気持ち悪いコードでもやり放題です。