Bug #1967
Segmentation fault at test_qsort1 and test_qsort2 in test/dl/test_func.rb running on sparc-solaris-2.10
| Status: | Rejected | Start date: | 08/20/2009 | |
|---|---|---|---|---|
| Priority: | Normal | Due date: | ||
| Assignee: | % 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
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>