Bug #21125
Updated by mikik0 (Hashino Mikiko) 13 days ago
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:
``` ruby
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
``` shell
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
``` shell
"system"
```
PR that may be relevant: https://github.com/ruby/ruby/pull/11028