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

アーカイブの一覧に戻る

YamaKen yamak****@bp*****
2005年 9月 8日 (木) 10:08:30 JST


ヤマケンです。提案ありがとうございます。

At Wed, 07 Sep 2005 23:04:45 +0900,
yusuk****@w5***** wrote:
> YamaKen wrote:
> > だいぶ間が空いてしまいましたが、r1450で対策コードを入れてみまし
> > た。SCM_GCC4_READY_GCを1に設定すると有効になりますが、まだ
> > uim-scm側の対応コードがないのでsscmで試すだけしかできませんが。
> この仕掛けは大掛かり過ぎな気がするので、考えてみたのですが
> インタプリタの出入り口の関数だけは
> ローカル変数を詰めた構造体を作って順序を
> 保証するというのはどうでしょうか?
> struct {
>   ScmObj stack_start;
>   ScmObj str_port;
>   ScmObj ret;
> } local_variables;

こういった発想は頭になかったのでおおっと思ったんですが、順序保証
メソッドについては既に問題ではなく、[Anthy-dev 2281]のようなそれ
なりに単純な仕組みで自由度の高いコードが書けます。

問題は暗黙のインライン展開です。

[Anthy-dev 2281]のやっている事は基本的に以下のような関数分離です
が、この場合eval_strが暗黙に展開されてしまった場合にstr_port等が
caller側に展開されてstack_startの範囲外に出てしまう可能性が考え
られます。既に保護された状態で呼ばれる事を想定している関数を呼ん
だ場合、田畑さん案でも同じ問題が発生します。このインライン展開を
防ぐ事があの大がかりなマクロの目的です(storage-protection.c の
Design Considerations参照)。

caller:
{
  ScmObj stack_start;

  gc_protect_stack(&stack_start);
  eval_str("(number->string 32)");
  gc_unprotect_stack(&stack_start);
}

static const char *eval_str(const char *exp)
{
  ScmObj str_port = SCM_FALSE;
  ScmObj ret = SCM_FALSE;

  str_port = Scm_NewStringPort(exp);
  ret = SigScm_Read(str_port);
  ret = EVAL(ret, SCM_NULL);
  return SCM_STRING_STR(ret);
}

…と、ここまで書いて気付いたんですが、インライン展開を防ぐ事が目
的なら一旦&eval_strをstorage-protection.oの関数に通してから
(*f)(exp)の形で呼ぶようにすれば関数として呼ばれる事が保証できま
すね。ちょっとその形に変更してみます。

よい刺激ありがとうございました。

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



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