LoginSignup
0
0

More than 5 years have passed since last update.

Ruby 2.5.xでdeep-coverを使うときは、エッジケースのバグがあるので注意

Last updated at Posted at 2019-03-23

Ruby 2.5.x + deep-coverでエッジケースのバグを見つけました。
原因はおそらくRubyのバグです。
Ruby 2.6.0では再現しません。

詳細はこちら
https://github.com/deep-cover/deep-cover/issues/47

deep-coverを有効にすると、以下のコードの挙動が変化します。

class NgClass
  def self.my_class_method(
      a0: 0, a1: 0, a2: 0, a3: 0, a4: 0, a5: 0, a6: 0, a7: 0, a8: 0, a9: 0,
      b0: 0, b1: 0, b2: 0, b3: 0, b4: 0, b5: 0, b6: 0, b7: 0, b8: 0, b9: 0,
      c0: 0, c1: 0, c2: 0, c3: 0, c4: 0, c5: 0, c6: 0, c7: 0, c8: 0, c9: 0,
      d0: 0, d1: 0,
      x: 0
    )
    x
  end
end

deep-coverなしでも以下のコードはRuby 2.5.xで仕様どおりに動きません

deep-coverが書き換えたコード

($_cov ||= {})[0]||=Array.new(38,0);$_cov[0][37]+=1;_temp=nil;((_temp=(class NgClassRewritten
  $_cov[0][36]+=1;((_temp=(def (self).my_class_method(
    a0: ($_cov[0][0]+=1;0), a1: ($_cov[0][1]+=1;0), a2: ($_cov[0][2]+=1;0), a3: ($_cov[0][3]+=1;0), a4: ($_cov[0][4]+=1;0), a5: ($_cov[0][5]+=1;0), a6: ($_cov[0][6]+=1;0), a7: ($_cov[0][7]+=1;0), a8: ($_cov[0][8]+=1;0), a9: ($_cov[0][9]+=1;0),
        b0: ($_cov[0][10]+=1;0), b1: ($_cov[0][11]+=1;0), b2: ($_cov[0][12]+=1;0), b3: ($_cov[0][13]+=1;0), b4: ($_cov[0][14]+=1;0), b5: ($_cov[0][15]+=1;0), b6: ($_cov[0][16]+=1;0), b7: ($_cov[0][17]+=1;0), b8: ($_cov[0][18]+=1;0), b9: ($_cov[0][19]+=1;0),
        c0: ($_cov[0][20]+=1;0), c1: ($_cov[0][21]+=1;0), c2: ($_cov[0][22]+=1;0), c3: ($_cov[0][23]+=1;0), c4: ($_cov[0][24]+=1;0), c5: ($_cov[0][25]+=1;0), c6: ($_cov[0][26]+=1;0), c7: ($_cov[0][27]+=1;0), c8: ($_cov[0][28]+=1;0), c9: ($_cov[0][29]+=1;0),
        d0: ($_cov[0][30]+=1;0), d1: ($_cov[0][31]+=1;0),
        x: ($_cov[0][32]+=1;0)
    )
    $_cov[0][34]+=1;_temp=nil;x
  end);$_cov[0][33]+=1;_temp=_temp))
end);$_cov[0][35]+=1;_temp=_temp))

Rubyの修正差分

誰か、元となるrubyの修正差分やバグ報告を知っていたら教えてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0