Project

General

Profile

Actions

Bug #13956

closed

Segmentation fault when calling Method#using with a non-module argument and block

Added by minoritea (Minori Tokuda) about 7 years ago. Updated about 7 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]
[ruby-dev:50270]

Description

Module#usingをモジュールでない引数とブロックをつけて呼び出すとクラッシュします。

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

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) crash_report.txt crash report minoritea (Minori Tokuda), 09/30/2017 11:06 AM
ruby_2017-09-30-200248_mtmbp15.crash (11.4 KB) ruby_2017-09-30-200248_mtmbp15.crash OS crash report minoritea (Minori Tokuda), 09/30/2017 11:06 AM
segfault_on_using.rb (40 Bytes) segfault_on_using.rb reproducing program minoritea (Minori Tokuda), 09/30/2017 11:06 AM
Actions #1

Updated by nobu (Nobuyoshi Nakada) about 7 years ago

  • Status changed from Open to Closed

Applied in changeset trunk|r60077.


eval.c: check type

Actions #2

Updated by nagachika (Tomoyuki Chikanaga) about 7 years ago

  • Backport changed from 2.3: UNKNOWN, 2.4: UNKNOWN to 2.3: DONTNEED, 2.4: REQUIRED

Updated by znz (Kazuhiro NISHIYAMA) about 7 years ago

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
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0