[Anthy-dev 2281] Re: r5rs: Scm_eval_c_string バグ, スタック保護

Zurück zum Archiv-Index

YamaKen yamak****@bp*****
2005年 8月 24日 (水) 20:49:09 JST


At Wed, 24 Aug 2005 03:39:16 -0700,
jun.l****@gmail***** wrote:
> 
> On Wed, 24 Aug 2005 12:18:58 +0900
> YamaKen <yamak****@bp*****> wrote:
> > uim APIの保護はuim_scm_eval_c_string()とuim_scm_eval()だけに仕掛
> > ければ大丈夫です。

> ;; 今、少し前に落とした trunk を見ると、同様の (ラップしてない) コードが
> ;; ありましたが、大丈夫でしょうか。

あ、間違えてました。uim_scm_eval()の場合は呼び出し側のスタックに
uim_lispがある事が普通ですからその都度ラップしてやらないとだめで
すね。

> > libsscmや、uim APIを経由せずuim-scm APIを直接扱うコードではその
> > ように自前でwrapper を用意して保護してもらう必要がありますね。
> [...]
> > C99ならvariadic macroで解決できるんで、libsscmのユーザ向けには
> > C99環境用のオプショナルなwrapperマクロを提供するあたりでどうでしょ
> > う。uim APIを経由しないuim-scm APIの利用ではC89対応の手書き推奨
> > という事で。
> 
> 
> variadic macro で? どうするつもりでしょうか。何か poor man's variadic
> macro (そんな言い方あるのか知りませんが) が使えない方法ですか?
> 
> #define foo(vargs) (bar vargs)
> 
> foo ((arg1, arg2, arg3)) --> (bar (arg1, arg2, arg3))

これなら大丈夫です。今までこの技法を知りませんでした…

「macro trick c "variable number"」でググったら以下のようなペー
ジが大量に引っかかりましたが、特に定まった一般名称は無いようです
ね。
http://www.lysator.liu.se/faq/c-faq/c-6.html

意図していたのは以下のような呼び出しです。

#define SCM_GC_PROTECT_STACK(func_invocation) \
  {                                       \
    ScmObj *stack_start;                  \
                                          \
    stack_start = Scm_gc_protect_stack(); \
    (func_invocation);                    \
    Scm_gc_unprotect_stack(stack_start);  \
  }


/* 実際にはSigScheme依存を隠蔽したUIM_SCM_GC_PROTECT_STACKを利用 */
SCM_GC_PROTECT_STACK(uim_create_context_internal(uc, lang, engine));

void
uim_create_context_internal(uim_context uc,
                            const char *lang, const char *engine)
{
  uim_lisp id_     = uim_scm_make_int(uc->id);
  uim_lisp lang_   = uim_scm_make_str(lang);
  uim_lisp engine_ = uim_scm_make_str(engine);
  uim_lisp proc    = uim_scm_make_symbol("create-context");
  uim_lisp form    = uim_scm_list4(proc, id_, lang_, engine_);

  uim_scm_eval(form);
}

-------------------------------
ヤマケン yamak****@bp*****



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