morita
morit****@razil*****
2008年 8月 2日 (土) 11:53:53 JST
森です。 いつもご指摘ありがとうございます。 手元で再現しましたので修正します。 Kouhei Sutou さんは書きました: > 須藤です。 > > ちょっと前(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; > } > _______________________________________________ > Senna-dev mailing list > Senna****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/senna-dev > バグ報告方法:http://qwik.jp/senna/bug_report.html