[ruby-dev:50277] [Ruby trunk Bug#13956] Segmentation fault when calling Method#using with a non-module argument and block

From: zn@...
Date: 2017-10-03 13:18:47 UTC
List: ruby-dev #50277
Issue #13956 has been updated by znz (Kazuhiro NISHIYAMA).


`using` は top level (`main`) の特異メソッド (と `Module#using`) なので、`Object` のインスタンスメソッドより優先されるため、上書きするなら `def self.using` にする必要があるようです。

```
% ruby -e 'p method(:using)'
#<Method: main.using>
%  ruby -e 'def m;end;p method(:m)'
#<Method: Object#m>
% ruby -we 'def self.using;end;using'
-e:1: warning: method redefined; discarding old using
```

----------------------------------------
Bug #13956: Segmentation fault when calling Method#using with a non-module argument and block
https://bugs.ruby-lang.org/issues/13956#change-67039

* Author: minoritea (Minori Tokuda)
* Status: Closed
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]
* Backport: 2.3: DONTNEED, 2.4: REQUIRED
----------------------------------------
Module#usingをモジュールでない引数とブロックをつけて呼び出すとクラッシュします。

再現プログラムは以下です。

~~~ ruby
def using(x)
  yield x
end

using(1){ }
~~~

元々、別のメソッドに**using**と名付けてそれを呼び出すコードを書いてました(Module#usingの存在は失念していました)。

なぜそうなるのか理解していないのですが、トップレベルで定義したメソッドはModuleのメソッドをオーバーライドしないようで、
とにかく結果としてはModule#usingが呼ばれました。

元々の意図が分かりやすいよう、再現プログラムには**using**のメソッド定義を含めていますが、
Top-levelに**using**のメソッド定義があろうとなかろうとクラッシュは発生します。

Top-level以外のスコープでも同様のクラッシュは発生しますが、詳細には確認していません。
クラスやモジュールの定義の中で再現することは確認しました。

~~~
OS: macOS Sierra(10.12.6)
CPU: 2.2Ghz Intel Core i7
Memory: 16GB
Ruby version: ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]
  installed by ruby-build
~~~

---Files--------------------------------
crash_report.txt (6.63 KB)
ruby_2017-09-30-200248_mtmbp15.crash (11.4 KB)
segfault_on_using.rb (40 Bytes)


-- 
https://bugs.ruby-lang.org/

In This Thread

Prev Next