Kouhei Sutou
kou****@cozmi*****
2008年 8月 1日 (金) 16:05:55 JST
須藤です。
ちょっと前(1,2週間くらい前?)からだと思いますが、-O2付きでコンパイルすると
sen_pat_prefix_search()のテストが落ちます。-O2なしだと落ちません。
落ちるのは登録されている単語より短い語で検索したときです。もしかしたら、テス
トでSennaの使い方を間違っているのかもしれませんが。。。
環境はDebian GNU/LinuxのsidでGCCはこれです。
% gcc --version
gcc (Debian 4.3.1-8) 4.3.1
手元では最後につけたプログラムでも落ちて、こんなバックトレースになります。
(gdb) bt
#0 0x00007fdaa541b9ce in sen_hash_lookup (ctx=0xb58df0, hash=0xb5e5f0,
key=0x7fffad8cfc20, key_size=4, value=0x0,
flags=0x7fffad8cfc27 "@p\220{��\177") at hash.c:582
#1 0x00007fdaa54238c5 in get_tc (ctx=0xb58df0, pat=0xb5e5b0, h=0xb5e5f0,
rn=0x7fdaa33b7050) at pat.c:779
#2 0x00007fdaa5423795 in get_tc (ctx=0xb58df0, pat=0xb5e5b0, h=0xb5e5f0,
rn=0x7fdaa33b7040) at pat.c:777
#3 0x00007fdaa5423896 in get_tc (ctx=0xb58df0, pat=0xb5e5b0, h=0xb5e5f0,
rn=0x7fdaa33b7010) at pat.c:788
#4 0x00007fdaa5425927 in sen_pat_prefix_search (ctx=0xb58df0, pat=0xb5e5b0,
key=0x7fdaa386c18c, key_size=<value optimized out>, h=0xb5e5f0)
at pat.c:824
#5 0x0000000000400cc9 in dump (context=0xb58df0, pat=0xb5e5b0,
key=0x400fe7 "�\202�") at xxx.c:30
#6 0x0000000000400e89 in main (argc=1, argv=0x7fffad8d0f18) at xxx.c:77
#include <stdio.h>
#include <string.h>
#include <pat.h>
#include <hash.h>
static sen_id
add(sen_ctx *context, sen_pat *pat, const char *key)
{
sen_table_search_flags flags;
flags = SEN_TABLE_ADD;
return sen_pat_lookup(context, pat, key, strlen(key), NULL, &flags);
}
#define BUFFER_SIZE 4096
static void
dump(sen_ctx *context, sen_pat *pat, const char *key)
{
sen_id id;
sen_hash *hash;
sen_hash_cursor *cursor;
sen_rc rc;
hash = sen_hash_create(context, NULL, sizeof(sen_id),
0, SEN_HASH_TINY, sen_enc_utf8);
rc = sen_pat_prefix_search(context, pat, key, strlen(key), hash);
printf("key: %s: %d\n", key, rc);
cursor = sen_hash_cursor_open(context, hash,
NULL, 0, NULL, 0,
SEN_CURSOR_DESCENDING);
id = sen_hash_cursor_next(context, cursor);
while (id != SEN_ID_NIL) {
sen_id *pat_id;
void *hash_key;
char key[BUFFER_SIZE];
int size;
sen_hash_cursor_get_key(context, cursor, &hash_key);
pat_id = hash_key;
size = sen_pat_get_key(context, pat, *pat_id, key, sizeof(key));
key[size] = '\0';
printf("%s\n", key);
id = sen_hash_cursor_next(context, cursor);
}
printf("\n");
sen_hash_cursor_close(context, cursor);
sen_hash_close(context, hash);
}
int
main(int argc, char **argv)
{
sen_ctx *context;
sen_pat *pat;
sen_init();
context = sen_ctx_open(NULL, SEN_CTX_USEQL);
pat = sen_pat_create(context, "/tmp/xxx", 128, 64,
0, /* SEN_PAT_WITH_SIS, */
sen_enc_utf8);
add(context, pat, "セナ");
add(context, pat, "ナセナセ");
add(context, pat, "Senna");
add(context, pat, "セナ + Ruby");
add(context, pat, "セナセナ");
dump(context, pat, "セ");
sen_pat_close(context, pat);
sen_ctx_close(context);
sen_fin();
return 0;
}