[Senna-dev 990] Re: gcc -O2でsen_pat_prefix_search()が落ちる

Zurück zum Archiv-Index

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




Senna-dev メーリングリストの案内
Zurück zum Archiv-Index