寺西です。

Tadamasa Teranishi wrote:
> 
> この情報を元にちょっと調べてみます。

いろいろ調べてみると、cmp_phrase_hash 内で free した val.data に
アクセスする可能性がありました。
# デバッガの情報のまんまですけど。

> 素人考えでは、val.data[j]に入っているポインタの値が変になってる
> 様に思えるのですが、これがどこで alloc されてるのかが追えなくて…

その通りでした。

もう少し書くと、フレーズ検索の際に do_phrase_search の中から
cmp_phrase_hash を呼び出すのですが、この第二引数 val が
TOO_MUCH_* の場合に val.data は free 済みとなっています。
にもかかわらず、cmp_phrase_hash で使っているのでコアダンプするよう
です。
コアダンプせずに動く環境は、たまたま動いているだけでした。

おそらく "日本の歴史" で検索するのではなく、"日本 の 歴史" で検索
すればコアダンプしないと思います。

とりあえず、以下の修正を行えばコアダンプしないようになると思います。
ただ、

$ namazu -f namazurc "日本の歴史" .
検索結果

参考ヒット数:  {  [ 日本 (ヒット数が多すぎるので無視しました)  ]  [ の (
ヒット数が多すぎるので無視しました)  ]  [ 歴史: 1 ]  :: 0 }

検索式にマッチする文書はありませんでした。

ですが、

$ namazu -f namazurc "日本 の 歴史" .
検索結果

参考ヒット数:  [ 日本 (ヒット数が多すぎるので無視しました)  ]  [ の (ヒ
ット数が多すぎるので無視しました)  ]  [ 歴史: 1 ]

検索式にマッチする 1 個の文書が見つかりました。

1. test3.txt (スコア: 2)
著者: 不明
日付: Thu, 14 Sep 2006 17:14:26 +0900
歴史
/tmp/debug/test3.txt (5 bytes)




現在のリスト: 1 - 1

となります。フレーズ検索の場合、「ヒット数が多すぎるので無視しました」
というメッセージですが、個々のワードを無視しているのではなく、
フレーズ全体を無視するような動作となり、メッセージが適当とはいえない
かもしれません。


$ diff -up search.c.org search.c
--- search.c.org        2006-09-15 02:03:06.000000000 +0900
+++ search.c    2006-09-15 02:03:46.000000000 +0900
@@ -355,6 +355,10 @@ cmp_phrase_hash(int hash_key, NmzResult
     if (val.num == 0) {
         return val;
     }
+    if (val.stat != SUCCESS) {
+        nmz_debug_printf("cmp_phrase_hash: val.stat [%d]\n", val.stat);
+        return val;
+    }
     ptr = nmz_getidxptr(phrase_index, hash_key);
     if (ptr < 0) {
        nmz_free_hlist(val);

-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  [EMAIL PROTECTED]
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E

_______________________________________________
Namazu-users-ja mailing list
Namazu-users-ja@namazu.org
http://www.namazu.org/cgi-bin/mailman/listinfo/namazu-users-ja

メールによる返信