卜部昌平のあまりreblogしないtumblr RSS

Archive

Apr
8th
Thu
permalink

[ruby] Class.allocateが拓く(新しい地平 or バグの鉱脈)について

今日発見したんだけどClass.allocateが禁止されてないわけよ。

だからどうしたと思うかもしれないけど、これさ、ちょっとひねって

c = Class.allocate
d = Class.allocate
c.send :initialize, d
d.send :initialize, c

ってやると、cとdって互いに互いを継承しあっているという、あらゆるすべての前提条件をまるっきり無視した子ができるわけ。おかしかろ? RubyのクラスはすべからくObjectから生えるんじゃなかったのかよ。

でさ、まあそんだけだとあらゆるすべてのメソッド定義がない(BasicObjectよりもまっさら、本気でなんもない)から、とりあえずallocateだけBasicObjectから引っ張ってくるよね。

require 'dl'
DL.dlopen do |h|
  geta = h['rb_get_alloc_func']
  seta = h['rb_define_alloc_func']
  getf = DL::CFunc.new geta, DL::TYPE_VOIDP
  setf = DL::CFunc.new seta
  setf[[ DL.dlwrap(c), getf[[ DL.dlwrap(BasicObject) ]]]]
end

puts "yes" if c.allocate

うわぁ…これやべー。これやべーよ。Rubyはじまったよ。

とりあえずこの方向でSEGVさせる方法を募集します。こんな機能危なすぎる。はやいうちにこれ不可能ってことにしとかないと…

  1. kachick1 reblogged this from shyouhei
  2. sighingdog reblogged this from shyouhei
  3. d0gf00d-blog-blog reblogged this from shyouhei
  4. deepneko reblogged this from shyouhei
  5. yosshi-blog reblogged this from shyouhei
  6. sanemat-blog reblogged this from shyouhei
  7. atm09td reblogged this from ukar
  8. ukar reblogged this from shyouhei
  9. pipco reblogged this from shyouhei
  10. send-blog reblogged this from shyouhei
  11. shyouhei posted this