Project

General

Profile

Actions

Bug #21125

open

Kernel is called first

Added by mikik0 (Hashino Mikiko) 14 days ago. Updated 13 days ago.

Status:
Open
Target version:
-
ruby -v:
ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +PRISM [arm64-darwin24]
[ruby-core:120915]

Description

Kernel#system is being called when there is a column or method name named system.
The other methods of Kernel reproduce the problem.
Ex.Rand returns a random value, and exit terminates the program.

This problem did not occur until Ruby 3.3 series, but has occurred since Ruby 3.4.

Reproducible script:

class ObjectifiedHash
  def initialize(hash)
    @hash = hash
  end

  private

  attr_reader :hash

  def method_missing(method_name, *args, &block)
    if hash.key?(method_name.to_sym)
      hash[method_name.to_sym]
    else
      super
    end
  end

  def respond_to_missing?(method_name, include_private = false)
    hash.key?(method_name.to_sym) || super
  end
end

class Foo
  def system(...)
    # Kernel#system is called
    raw.system(...)
    # (...) passes if there is no
    # raw.system
  end

  def initialize(raw)
    @raw = raw
  end

  def get_system
    system
  end

  private

  attr_reader :raw
end

class Test
  def self.run
    obj = ObjectifiedHash.new({
      system: 'system'
    })

    foo = Foo.new(obj)
    # foo.system would pass.
    # After executing foo.system, hoge.get_system also passes.
    # p foo.system
    p foo.get_system
  end
end

Test.run

Execution Results

hoge.rb:26:in 'Kernel#system': wrong number of arguments (given 0, expected 1+) (ArgumentError)

    raw.system(...)
               ^^^
        from ruby.rb:26:in 'Foo#system'
        from ruby.rb:36:in 'Foo#get_system'
        from ruby.rb:54:in 'Test.run'
        from ruby.rb:58:in '<main>'

Expected results

"system"

PR that may be relevant: https://github.com/ruby/ruby/pull/11028

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0