2003-07-27

追記: 下記の件を修正したcsvform, dtnchot, strhist, timestampを公開しました。strhist以外は基本的に下記の問題に該当する箇所の修正のみです。strhistは、2.12以降を公開するのを忘れてたみたいです(苦笑)。あと、おまけがちょっと豪華になったのがひとつあります(笑)。ダウンロードできないなどのトラブルがありましたらお知らせください。

追記その2: いたずらに不安をあおるような書き方をしている気がしたので、小見出しをあらためました。……その後、あらためたやつは不正確なような気がしたので、さらに普通の言葉にあらためました。

今日の範囲外アクセス(TX-C)

strcpymax(sz1,sz2,size)

strcpyと同じですが、sizeを超えない文字数だけをコピーします。例:
strcpymax(sz,"0123456789",5);
szの内容は“0123”になります。

strcpylen(sz1,sz2,lch)

sz1sz2を最大lchバイトコピーし、sz1[lch] = 0にします。例:
strcpylen(sz,"0123456789",5);
szの内容は“01234”になります。

うわー! strcpymaxを使うべきところでstrcpylenを使いまくってました。懺悔ものです。

strcpylen(szsearch, sz, CCHPATHNAME);なんてやってるのは完璧にアウトですね(dtnchot)。szsearchの範囲をひとつ超えたところに '¥0' が書き込まれる。

次のようなコードを実行すると、その実害を観察できます(WZ 4.00Fa β2.1で確認、ただし環境によって再現しない可能性もあり)。

void main(TX *text)
{
    mchar sz1[CCHWORD] = "あああ";
    mchar sz2[CCHWORD] = "";
    information("%s", sz1);     // 「あああ」と表示(正常)。
    strcpylen(sz2, sz1, CCHWORD);
    information("%s", sz1);     // 文字列が空になっている。
}

2度目のinformationではsz1が空になっています。メモリ上でsz1sz2が隣接していて、sz1[0]'¥0' が書き込まれているものと思われます。

マクロの方も近いうちに直します。おぅ、みんな、見捨てないで…。