[ruby-core:113038] [Ruby master Bug#19554] Invalid memory access detected by Valgrind when using Fibers
From:
"ioquatix (Samuel Williams) via ruby-core" <ruby-core@...>
Date:
2023-03-29 08:02:24 UTC
List:
ruby-core #113038
Issue #19554 has been updated by ioquatix (Samuel Williams).
Supporting Valgrind is a good idea. However, I actually prefer ASAN. But both are good tools.
I recently added ASAN support for fibers/coroutines: https://github.com/ioquatix/ruby/commit/901525b1079ac02da0122a76d8e4c3546a7f80f6
I also proposed to add it to the build matrix: https://github.com/ruby/ruby/pull/5939
You will probably find that without Valgrind knowing about the stack swapping, it won't work, you'll need to inform it when the stack is swapped.
I don't really want to maintain two different implementations of "stack swapping instrumentation". I suppose we could abstract it out, however, it's fairly non-trivial/invasive.
Therefore, it might be better to use ASAN over Valgrind to keep the code simpler. Or, if we decided Valgrind was better, we should remove ASAN, for example.
----------------------------------------
Bug #19554: Invalid memory access detected by Valgrind when using Fibers
https://bugs.ruby-lang.org/issues/19554#change-102575
* 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/