[groonga-dev,00142] Re: スタックオーバーフロー

アーカイブの一覧に戻る

morit****@razil***** morit****@razil*****
2009年 7月 28日 (火) 22:20:02 JST


森です。

grn_expr_exec()に渡しているgrn_exprで、
popするオブジェクトよりpushするオブジェクトの方が
多くなっているのかも知れません。

オーバーフローするパタンを教えていただけますか?

>>> Kouhei Sutou さんは書きました:
> 須藤です。
> 
> grn_ctxはスタックを持っていますが、何度もgrn_expr_exec()して
> いるとスタックがオーバーフローしてしまいます。
> 
> よくわかっていないのですが、sizeof(grn_obj *)で割る必要があ
> るのかなぁと思いました。
> 
> diff --git a/lib/db.c b/lib/db.c
> index 93b3c6d..aa57446 100644
> --- a/lib/db.c
> +++ b/lib/db.c
> @@ -5460,7 +5460,7 @@ grn_obj_unlink(grn_ctx *ctx, grn_obj *obj)
>  }
>  
>  #define WITH_SPSAVE(block) {\
> -  ctx->impl->stack_curr = sp - ctx->impl->stack;\
> +  ctx->impl->stack_curr = (sp - ctx->impl->stack) / sizeof(grn_obj *);\
>    block\
>    if (sp != ctx->impl->stack + ctx->impl->stack_curr) {\
>      sp = ctx->impl->stack + ctx->impl->stack_curr;\
> @@ -6309,7 +6309,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr)
>        }
>      }
>      res = s0;
> -    ctx->impl->stack_curr = sp == ctx->impl->stack ? 0 : sp - ctx->impl->stack - 1;
> +    ctx->impl->stack_curr = sp == ctx->impl->stack ? 0 : (sp - ctx->impl->stack - 1) / sizeof(grn_obj *);
>    }
>  exit :
>    GRN_API_RETURN(res);
> 
> -- 
> 須藤 功平 <kou****@clear*****>
> 株式会社クリアコード (http://www.clear-code.com/)
> 
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
> 
--
morita




groonga-dev メーリングリストの案内
アーカイブの一覧に戻る