From: Naohisa Goto Date: 2009-08-20T22:35:12+09:00 Subject: [ruby-dev:39146] [Bug #1967] Segmentation fault at test_qsort1 and test_qsort2 in test/dl/test_func.rb running on sparc-solaris-2.10 Bug #1967: Segmentation fault at test_qsort1 and test_qsort2 in test/dl/test_func.rb running on sparc-solaris-2.10 http://redmine.ruby-lang.org/issues/show/1967 起票者: Naohisa Goto ステータス: Open, 優先度: Normal ruby -v: ruby 1.9.2dev (2009-08-19) [sparc-solaris2.10] sparc-solaris-2.10 で 64ビットコンパイルした場合、 make check が test/dl/test_func.rb の test_qsort1 にて Segmentation fault になります。 原因は、引数の型でした。 void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)); の size_t 型の引数 nmenb および size に対して TYPE_INT が指定されていますが、 size_t は 64ビット環境では unsigned long になるため、特にsparc v9 のような ビッグエンディアンの環境では異常な数値が qsort の引数に渡るのが原因でした。 TYPE_INT を TYPE_LONG に変更した以下のパッチで直りました。 (TYPE_SIZE_T は存在しない?) Index: test/dl/test_func.rb =================================================================== --- test/dl/test_func.rb (revision 24582) +++ test/dl/test_func.rb (working copy) @@ -43,7 +43,7 @@ cb = Function.new(CFunc.new(0, TYPE_INT, 'qsort'), [TYPE_VOIDP, TYPE_VOIDP]){|x,y| CPtr.new(x)[0] <=> CPtr.new(y)[0]} qsort = Function.new(CFunc.new(@libc['qsort'], TYPE_VOID, 'qsort'), - [TYPE_VOIDP, TYPE_INT, TYPE_INT, TYPE_VOIDP]) + [TYPE_VOIDP, TYPE_LONG, TYPE_LONG, TYPE_VOIDP]) buff = "9341" qsort.call(buff, buff.size, 1, cb) assert_equal("1349", buff) @@ -53,7 +53,7 @@ cb = TempFunction.new(CFunc.new(0, TYPE_INT, 'qsort'), [TYPE_VOIDP, TYPE_VOIDP]) qsort = Function.new(CFunc.new(@libc['qsort'], TYPE_VOID, 'qsort'), - [TYPE_VOIDP, TYPE_INT, TYPE_INT, TYPE_VOIDP]) + [TYPE_VOIDP, TYPE_LONG, TYPE_LONG, TYPE_VOIDP]) buff = "9341" qsort.call(buff, buff.size, 1, cb){|x,y| CPtr.new(x)[0] <=> CPtr.new(y)[0]} assert_equal("1349", buff) ---------------------------------------- http://redmine.ruby-lang.org