[Senna-dev 989] gcc -O2でsen_pat_prefix_search()が落ちる

Back to archive index

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;
}


Senna-dev メーリングリストの案内
Back to archive index