Project

General

Profile

Actions

Bug #4260

closed

some SEGVs in test/ruby/test_enum.rb

Added by usa (Usaku NAKAMURA) over 13 years ago. Updated almost 13 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 1.9.3dev (2011-01-11 trunk 30510) [x64-mswin64_100]
Backport:
[ruby-dev:43003]

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

Actions #1

Updated by usa (Usaku NAKAMURA) over 13 years ago

  • Status changed from Open to Assigned
  • Assignee set to akr (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

Actions #2

Updated by nagachika (Tomoyuki Chikanaga) over 13 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

Actions #3

Updated by akr (Akira Tanaka) over 13 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

Actions #4

Updated by usa (Usaku NAKAMURA) over 13 years ago

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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0