[1195] Re:os
投稿者:(ぱ)こと管理人
2009/01/04 09:23:39
昨日は帰省してネットから切り離された上、風邪で実家で寝込んでまして、
すっかり遅くなりましてすみません。
>>(2)725~728行目のみをコメントアウト
…
>----上の変更を加えて sh test.sh を実行
これでかなり原因が絞れました。ありがとうございます。
最近追加した文字リテラル関連でバグを入れてしまったかな、と思い、
追求したところ、怪しいところがあっさり見つかりました…
compiler以下のstring.cの中に、以下の関数があります(59行目)。
int
dkc_close_character_literal(void)
{
DVM_Char buf[1];
ここの
誤)
DVM_Char buf[1];
を
正)
DVM_Char buf[2];
に直してコンパイル/実行を試していただけますか。
# mainの下でmakeするだけではここのコンパイルは通らないので、
# compilerの下でいったんmakeしてからmainの下でもmakeするか、
# mainの下で touch main.c してからmainの下でmakeしてください。
ここは文字リテラル(「'本'」のような1文字の定数)の値を抽出しているところで、
1文字であることはその前後の判定で明らかなので、1文字分のバッファを取っておけば
よいかと思っていたのですが、
dvm_mbstowcs(st_string_literal_buffer, buf);
実際に変換しているこの関数では、末尾にL'\0'を補っているので、
領域破壊が起きていました。末尾ナル文字分を忘れるとは初心者並みのポカでした。
4バイトかそこらのスタック領域の破壊だと、(現にうちの環境で動いていたように)
たまたま動いてしまう場合も多く、つよしさんのところでこの現象で死んでいるか
どうかはわかりませんが、可能性は高いと思います。
いろいろと情報いただきありがとうございました。送球に修正してリリースします。