Bug #1967

Segmentation fault at test_qsort1 and test_qsort2 in test/dl/test_func.rb running on sparc-solaris-2.10

Added by ngoto (Naohisa Goto) almost 3 years ago. Updated about 1 year ago.

[ruby-dev:39146]
Status:Rejected Start date:08/20/2009
Priority:Normal Due date:
Assignee:tenderlovemaking (Aaron Patterson) % Done:

0%

Category:ext
Target version:1.9.2
ruby -v:ruby 1.9.2dev (2009-08-19) [sparc-solaris2.10]

Description

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, '<callback>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, '<callback>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)

Related issues

related to ruby-trunk - Bug #1977: test failed in test_isdigit in test/dl/test_func.rb on sp... Closed 08/21/2009

History

Updated by yugui (Yuki Sonoda) over 2 years ago

  • Category set to ext
  • Status changed from Open to Assigned
  • Target version set to 1.9.2

Updated by mame (Yusuke Endoh) about 2 years ago

  • Assignee set to tenderlovemaking (Aaron Patterson)
アーロン宛です。
遠藤です。

dl に関するこのチケットをどう思いますか?
ffi に同じような問題はないですか?

dl はすでに x86_64 における API 設計上の問題が指摘されている [1] ので、
ffi に同じ問題がないのなら、この問題は WONTFIX でも構わないと思います。

# その場合、問題のテストを消すべきだろうか

[1] http://mkosaki.blog46.fc2.com/blog-entry-1069.html

-- 
Yusuke Endoh <mame@tsg.ne.jp>

Updated by mame (Yusuke Endoh) about 2 years ago

Hi, Aaron

Could you take a look at this ticket?

-- 
Yusuke Endoh <mame@tsg.ne.jp>

Updated by tenderlovemaking (Aaron Patterson) about 2 years ago

2010/4/27 Yusuke Endoh <redmine@ruby-lang.org>:
> チケット #1967 が更新されました。 (by Yusuke Endoh)
>
> 担当者 Aaron Pattersonにセット
>
> アーロン宛です。
> 遠藤です。
>
> dl に関するこのチケットをどう思いますか?
> ffi に同じような問題はないですか?

ffiは x86_64 をsupportしているので、ffi に同じような問題はないと思います。

> dl はすでに x86_64 における API 設計上の問題が指摘されている [1] ので、
> ffi に同じ問題がないのなら、この問題は WONTFIX でも構わないと思います。

この件のABI の翻訳はffi自身のタスクなので、このチケットはWONTFIXとしておいて、問題ないと思います。

> # その場合、問題のテストを消すべきだろうか
>
> [1] http://mkosaki.blog46.fc2.com/blog-entry-1069.html
>
> --
> Yusuke Endoh <mame@tsg.ne.jp>
> ----------------------------------------
> http://redmine.ruby-lang.org/issues/show/1967
>
> ----------------------------------------
> http://redmine.ruby-lang.org
>
>



-- 
Aaron Patterson
http://tenderlovemaking.com/

Updated by mame (Yusuke Endoh) about 2 years ago

  • Status changed from Assigned to Rejected
遠藤です。

それでは、WONTFIX ということで閉じます。
64 ビット Solaris でテストをする場合は fiddle を使用してください。

-- 
Yusuke Endoh <mame@tsg.ne.jp>

Also available in: Atom PDF