山本です。 >> まだ良く調べてないんですが、sample/tkextlib/treectrl/mailwasher.rb >> でカラムをクリックすると segfault するバグがありました。 > >(;_;)(;_;)(;_;)(;_;) >まだ問題が残っているのでしょうね. >時間ができれば調べてみますが,私だけだと 1.8.3-preview1 には >間に合わない可能性が極めて高いと思います. >もし他にも情報がありましたら,教えていただけると助かります. 結論から言うと、tk::treectrl 側のバグでした。 私は http://sourceforge.net/projects/tktreectrl でダウンロードした tktreectrl-1.1-1 を使っているのですが、この版でカラム数の不足した 項目を登録すると、下のように DictionaryCompare に NULL ポインタが 渡り、それをデリファレンスしようとして SEGV します。 Program received signal SIGSEGV, Segmentation fault. [Switching to thread 1300.0x440] 0x6ce250eb in DictionaryCompare (left=0x0, right=0x0) at generic/tkTreeItem.c:2163 2163 if (isdigit(UCHAR(*right)) /* INTL: digit */ (gdb) bt #0 0x6ce250eb in DictionaryCompare (left=0x0, right=0x0) at generic/tkTreeItem.c:2163 #1 0x6ce2547d in CompareDict (sortData=0x2461370, a=0x95d8f00, b=0x2461250, n=1) at generic/tkTreeItem.c:2269 #2 0x6ce2583a in CompareProc (sortData=0x2461370, a=0x95d8f00, b=0x2461250) at generic/tkTreeItem.c:2322 #3 0x6ce25ba2 in partition (sortData=0x2461370, left=0x95d8f00, right=0x95d8f30, pivot=0x2461250) at generic/tkTreeItem.c:2410 #4 0x6ce25cfb in quicksort (sortData=0x2461370, left=0x95d8f00, right=0x95d8f30) at generic/tkTreeItem.c:2464 #5 0x6ce25d24 in quicksort (sortData=0x2461370, left=0x95d8f00, right=0x95d8f48) at generic/tkTreeItem.c:2468 #6 0x6ce25d46 in quicksort (sortData=0x2461370, left=0x95d8ed0, right=0x95d8f48) at generic/tkTreeItem.c:2472 #7 0x6ce26e99 in ItemSortCmd (clientData=0x92a5e78, interp=0x2b85150, objc=11, objv=0x95d8cd0) at generic/tkTreeItem.c:2799 #8 0x6ce2a3da in TreeItemCmd (clientData=0x92a5e78, interp=0x2b85150, objc=11, objv=0x95d8cd0) at generic/tkTreeItem.c:3873 #9 0x6ce0b4f4 in TreeWidgetCmd (clientData=0x92a5e78, interp=0x2b85150, objc=11, objv=0x95d8cd0) at generic/tkTreeCtrl.c:766 ビルドできなかったので確かめてませんが、HEAD ではすでに修正されているようです。 static int CompareDict(SortData *sortData, struct SortItem *a, struct SortItem *b, int n) { char *left = a->item1[n].string; char *right = b->item1[n].string; /* make sure to handle case where no string value has been set */ if (left == NULL) { return ((right == NULL) ? 0 : (0 - UCHAR(*right))); } else if (right == NULL) { return UCHAR(*left); } else { return DictionaryCompare(left, right); } } 何で不足していたかというと、下のような理由でした。修正しておきます。 # lib/tkextlib/treectrl でこのバグに対処すべきかどうかはお任せします。 Index: mailwasher.rb =================================================================== RCS file: /src/ruby/ext/tk/sample/tkextlib/treectrl/mailwasher.rb,v retrieving revision 1.3 diff -u -w -b -p -r1.3 mailwasher.rb --- mailwasher.rb 7 Apr 2005 14:55:55 -0000 1.3 +++ mailwasher.rb 9 Apr 2005 16:18:24 -0000 @@ -106,7 +106,7 @@ def demoMailWasher(t) ['whoami / spammer.com', "Find out what you think about yourself"], ['downsized / spammer.com', "You need a better job"], ['poorhouse / spammer.com', "Your mortgage is a joke"], - ['spam4ever / spammer.com' "You need more spam"] + ['spam4ever / spammer.com', "You need more spam"] ].each{|frm, subj| item = t.item_create status = ['styNormal','styPossSpam','styProbSpam','styBlacklist'][rand(4)]