NULL::something

Login via flickr, はてな, TypeKey.

2005-01-22

Ruby コードを安全に実行する。

前にも書いたけど完全じゃないので。たぶん、これでいいはず。

def safe(lvl, tm=1)
    result = nil
    tg = nil
    th = Thread.start(lvl) do |level|
        tg = ThreadGroup.new.add(Thread.current)
        $SAFE = level
        result = yield
    end.join(tm)
    tg.list.each {|t| t.kill}
    raise TimeoutError unless th
    result
end

ThreadGroup を新しく作り、それにカレント実行スレッドを突っ込んで、信頼できないコードから生成されるスレッドを全てこいつの所属させ、実行終了したら kill! kill! kill!

IRC BOT の Ruby コード実行機能をこれにした。まぁしかし! SEGV されたら終りというどうしようもない脆弱性がありますけれども。

Trackback URI: http://lowreal.net/logs/2005/01/22/1.trackback

Ruby, ブロック引数をとるメソッド

def foo(a, b)
    yield a + b
end

def fop(a, b, &block)
    yield a + b
end

def foq(a, b, &block)
    block.call a + b
end

引数に &block を書かないとブロックをとるメソッドなのか取らないメソッドなのかわかりにくい。でもなんか &block を書くとダサい。

二番目の方法だと block という引数を使ってなくてキモい。三番目の方法は一般的なコードじゃなくてキモい。

さて、ホントは上のコードの block.call は block.yield (引数のチェックをしない) になるんだろうけど、NoMethodError がでる。なんでだろ。

$ ruby -v -e 'Proc.new {|t| puts t}.yield("foo")'
ruby 1.8.1 (2003-12-25) [i386-cygwin]
-e:1: undefined method 'yield' for #<Proc:0x100e6dd8@-e:1> (NoMethodError)
exit 1

Trackback URI: http://lowreal.net/logs/2005/01/22/2.trackback

NULL

RSS feed meter for http://lowreal.net/logs/latest

Alternates

  1. RSS 1.0
  2. Atom 1.0

Generated with Taglibro

この日記は Taglibro と呼ばれる XML ベースの XSLT をテンプレートとして使ったシステムを使っています。現在の Taglibro は Ruby, ruby-xslt, libxml-ruby による実装です。ソースコードはとりあえず公開していません。