Bug #15385
closedRuby process hang in ensure
Description
While playing with mutation testing of my code I've found a weird mutation that hangs Ruby process. The isolated code which triggers this freeze is:
require 'timeout'
puts Process.pid
def raise_before_returning
raise
[]
end
def doh
value = raise_before_returning
ensure
# p value # <-- that unblocks it
value if nil
end
Timeout.timeout(3) do
doh
end
-
Timeout
is unnecessary and was added to illustrate that it has no effect to interrupt hanged process. -
Process.pid
is printed for convenience to kill hanged process. - Printing
value
in ensure changes behavior, there is no hang when encounteringvalue if nil
below.
I've also checked ruby 2.6.0preview3 (2018-11-06 trunk 65578) [x86_64-darwin18]
and the problem persists.
Files
Updated by pawelpacana (Paweł Pacana) about 6 years ago
- File reproduce.rb reproduce.rb added
Updated by ujihisa (Tatsuhiro Ujihisa) about 6 years ago
This reproduces even without timeout library.
def doh
raise
ensure
123 if false
end
doh
looks like this is because the optimizer removed if false
or if nil
without adding nop
iseq.
Updated by pawelpacana (Paweł Pacana) about 6 years ago
ujihisa (Tatsuhiro Ujihisa) wrote:
looks like this is because the optimizer removedif false
orif nil
without addingnop
iseq.
Could it be related then to https://bugs.ruby-lang.org/issues/14959#note-7 and https://bugs.ruby-lang.org/issues/15392 then?
Updated by shyouhei (Shyouhei Urabe) about 6 years ago
- Related to Bug #14897: Unexpected behavior of `if` in specific code added
Updated by nobu (Nobuyoshi Nakada) about 6 years ago
- Status changed from Open to Closed
Applied in changeset trunk|r66326.
Fix infinite loop by ensure
- compile.c (iseq_insert_nop_between_end_and_cont): insert nop so
that the end of rescue and continuing points are not same, to
get rid of infinite loop. [Bug #15385]
Updated by nagachika (Tomoyuki Chikanaga) about 6 years ago
- Backport changed from 2.4: UNKNOWN, 2.5: UNKNOWN to 2.4: REQUIRED, 2.5: REQUIRED
I didn't confirm this can be reproduced on ruby_2_4 too.
After a quick code reading, I think it might be.
Updated by nagachika (Tomoyuki Chikanaga) almost 6 years ago
Memo: r61591, r61592, r66324 are related.
Updated by usa (Usaku NAKAMURA) over 5 years ago
- Backport changed from 2.4: REQUIRED, 2.5: REQUIRED to 2.4: WONTFIX, 2.5: DONE