Bug #4260

some SEGVs in test/ruby/test_enum.rb

Added by Usaku NAKAMURA over 4 years ago. Updated almost 4 years ago.

[ruby-dev:43003]
Status:Closed
Priority:Normal
Assignee:Akira Tanaka
ruby -v:ruby 1.9.3dev (2011-01-11 trunk 30510) [x64-mswin64_100] Backport:

Description

=begin
うまく説明できないんですが、r30494以後、test/ruby/test_enum.rbを実行するとSEGVが起きるようになりました。

(1) 単にtest-allで全テストを実行するとtest_sort_byでSEGV。再現性あり。
(2) test_enum.rbのみを実行するとtest_sort_byに辿りつく前にtest_dropでSEGV。再現性あり。
(3) test_enum.rbをtest_drop抜きで実行すると正常に終了。
(4) GC.stress=trueでtest_enum.rbを実行するとテストは完走するがruby終了時にSEGV。

なんだかよくわからないのですが、問題点は全て一緒で、array.cのrb_ary_resize()内の1348行目~1351行目のif()ブロックを削除すると問題が消えます。
また、もちろん、r30494をrevertすることによっても問題は消えます。
ですが、対処法としてはあまりに乱暴だと思うので現時点では対策は入れてありません。

噂ではプラットフォーム依存で私しか再現に成功してないという話なのですが、問題点と対処療法から考える限りでは、たまたま私だけが踏んでるだけで、他のプラットフォームでも何らかの潜在的な問題があるものと想像しています。

以上、とりあえず報告まで。
=end

History

#1 Updated by Usaku NAKAMURA over 4 years ago

  • Status changed from Open to Assigned
  • Assignee set to Akira Tanaka

=begin
その後、akrさんに、test_enum.rb内のtest_calccを抜くとどうなるか、と言われて確認したところ、SEGVしなくなりました。

test_callccはtest_dropやtest_sort_byの前に実行されているので、そこでメモリが破壊されているならその後のどこかでSEGVが起きるということで、説明はつきそうです。
また、test_callccの中ではsort_by(=enum.cのenum_sort_by)が呼ばれているので、r30494が影響しているというのも矛盾がありません。

とりあえずここまで情報追加ということで。
=end

#2 Updated by Tomoyuki Chikanaga over 4 years ago

=begin
手元では SEGV は起きないのですが、valgrind にかけると不正なメモリアクセスが検出されていました。

以下で valgrind の警告は消えたのですが、効くでしょうか?

diff --git a/enum.c b/enum.c
index d17d9d4..c891d71 100644
--- a/enum.c
+++ b/enum.c
@@ -802,13 +802,15 @@ sort_by_i(VALUE i, VALUE _data, int argc, VALUE *argv)
static int
sort_by_cmp(const void *ap, const void *bp, void *data)
{
- VALUE a = *(VALUE *)ap;
- VALUE b = *(VALUE *)bp;
+ VALUE a;
+ VALUE b;
VALUE ary = (VALUE)data;

  if (RBASIC(ary)->klass) {
     rb_raise(rb_eRuntimeError, "sort_by reentered");
  }
  • a = *(VALUE *)ap;
  • b = *(VALUE *)bp; return rb_cmpint(rb_funcall(a, id_cmp, 1, b), a, b); }

=end

#3 Updated by Akira Tanaka over 4 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

=begin
This issue was solved with changeset r30521.
Usaku, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end

#4 Updated by Usaku NAKAMURA over 4 years ago

=begin
本件解決を確認しました。ありがとうございました。
(ちなみに私の方で落ちる件はChikanagaさんのパッチじゃない方でした)
=end

Also available in: Atom PDF