Issue #13305 has been updated by mame (Yusuke Endoh).


I think I could fix the issue.  Nikita, thank you for the very useful report!

----------------------------------------
Bug #13305: Occasional segfaults after defining methods while running coverage
https://bugs.ruby-lang.org/issues/13305#change-63591

* Author: decuplet (Nikita Shilnikov)
* Status: Closed
* Priority: Normal
* Assignee: mame (Yusuke Endoh)
* Target version: 
* ruby -v: ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16], ruby 2.5.0dev (2017-03-13 trunk 57944) [x86_64-darwin16]
* Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN
----------------------------------------
The problem occurs on MRI 2.4.0 and the latest trunk only (2017-03-13 trunk 57944). After running `Coverage.start` code defines the same method few times but every time the size of the method increases. Occasionally MRI can fail on attempt to get the coverage result. The bug can be reproduced quite easily with the following two files

a.rb

```ruby
require 'coverage'
Coverage.start

require_relative './b'

add_method(Class.new)

Coverage.result
```

b.rb

```ruby
REPEATS = 400

def add_method(target)
  REPEATS.times do
    target.class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
      def foo
        #{"\n" * rand(REPEATS)}
      end
      1
    RUBY
  end
end
```

Run `ruby a.rb` to reproduce the bug. Several runs may be required before MRI fails, but for me it fails on almost every run.

Note that passing filename and line number to `class_eval` is important, so as adding `1` after the method definition. 

The crash report attached to the issue.

---Files--------------------------------
ruby_2017-03-12-223015_MacBook-Pro-Nikita-2.crash (12.2 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>