[ruby-core:113055] [Ruby master Bug#19554] Invalid memory access detected by Valgrind when using Fibers
From:
"peterzhu2118 (Peter Zhu) via ruby-core" <ruby-core@...>
Date:
2023-03-30 22:11:21 UTC
List:
ruby-core #113055
Issue #19554 has been updated by peterzhu2118 (Peter Zhu).
> It's unlikely that Valgrind will work with CRuby out of the box without Valgrind specific code e.g. for marking stacks, poisoning "freed" memory, etc.
Valgrind (without the memory leak detection feature, so only detecting invalid memory access) actually works very well with CRuby (excluding Fibers), which is why I opened this ticket.
For most C extensions, they are able to use Valgrind with memory leak detection using [ruby_memcheck](https://github.com/Shopify/ruby_memcheck), which applies heuristics to remove false-positive memory leaks in Ruby.
In fact, issues like #18264 and #18936 were found by Valgrind.
----------------------------------------
Bug #19554: Invalid memory access detected by Valgrind when using Fibers
https://bugs.ruby-lang.org/issues/19554#change-102593
* Author: peterzhu2118 (Peter Zhu)
* Status: Open
* Priority: Normal
* Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN
----------------------------------------
This issue was originally reported here: https://github.com/Shopify/ruby_memcheck/issues/14
Running the script shown below using `valgrind --trace-children=yes --num-callers=500 ruby test.rb` outputs a lot of invalid memory access errors. I've shown a few sample errors below.
I am able to reproduce this issue on the master branch (commit [1e9a218ade](https://github.com/ruby/ruby/commit/1e9a218ade3af90c18f42e3fea08e2fcea81222a)), 3.2, 3.1, 3.0.
```ruby
require "bundler/inline"
gemfile do
source "https://rubygems.org"
gem "graphql"
end
module Example
class FooType < GraphQL::Schema::Object
field :id, ID, null: false
end
class FooSource < GraphQL::Dataloader::Source
def fetch(ids)
ids
end
end
class QueryType < GraphQL::Schema::Object
field :foo, Example::FooType do
argument :foo_id, GraphQL::Types::ID, required: false, loads: Example::FooType
end
def foo(foo: nil); end
end
class Schema < GraphQL::Schema
query Example::QueryType
use GraphQL::Dataloader
def self.object_from_id(id, ctx)
ctx.dataloader.with(Example::FooSource).request(id)
end
end
end
Example::Schema.execute(<<-GRAPHQL)
{
foo(fooId: "Other") {
id
}
}
GRAPHQL
```
```
==203957== Use of uninitialised value of size 8
==203957== at 0x3453FD: vm_exec_core (vm.inc:4411)
==203957== by 0x357EFB: rb_vm_exec (vm.c:2366)
==203957== by 0x354E44: invoke_block (vm.c:1384)
==203957== by 0x355759: invoke_iseq_block_from_c (vm.c:1440)
==203957== by 0x355759: invoke_block_from_c_proc (vm.c:1538)
==203957== by 0x355759: vm_invoke_proc (vm.c:1568)
==203957== by 0x355DF4: rb_vm_invoke_proc (vm.c:1589)
==203957== by 0x48F695: rb_fiber_start (cont.c:2513)
==203957== by 0x48CCF8: fiber_entry (cont.c:831)
==203957==
==203957== Invalid write of size 8
==203957== at 0x48C407: fiber_pool_stack_reset (cont.c:325)
==203957== by 0x48C4E9: fiber_pool_vacancy_reset (cont.c:364)
==203957== by 0x48CBB0: fiber_pool_stack_release (cont.c:752)
==203957== by 0x48CECF: fiber_stack_release (cont.c:874)
==203957== by 0x48FC9F: fiber_switch (cont.c:2726)
==203957== by 0x4901F9: fiber_resume_kw (cont.c:2906)
==203957== by 0x490235: rb_fiber_resume_kw (cont.c:2912)
==203957== by 0x4903B7: rb_fiber_m_resume (cont.c:2973)
==203957== by 0x3337D6: ractor_safe_call_cfunc_m1 (vm_insnhelper.c:3166)
==203957== by 0x33440A: vm_call_cfunc_with_frame_ (vm_insnhelper.c:3357)
==203957== by 0x3345E1: vm_call_cfunc_with_frame (vm_insnhelper.c:3385)
==203957== by 0x3398E5: vm_sendish (vm_insnhelper.c:5225)
==203957== by 0x341203: vm_exec_core (insns.def:835)
==203957== by 0x357EFB: rb_vm_exec (vm.c:2366)
==203957== by 0x354E44: invoke_block (vm.c:1384)
==203957== by 0x355759: invoke_iseq_block_from_c (vm.c:1440)
==203957== by 0x355759: invoke_block_from_c_proc (vm.c:1538)
==203957== by 0x355759: vm_invoke_proc (vm.c:1568)
==203957== by 0x355DF4: rb_vm_invoke_proc (vm.c:1589)
==203957== by 0x48F695: rb_fiber_start (cont.c:2513)
==203957== by 0x48CCF8: fiber_entry (cont.c:831)
==203957== Address 0x9bad008 is in a rw- anonymous segment
```
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/