追記: 下記の件を修正した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)
sz1にsz2を最大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が空になっています。メモリ上でsz1とsz2が隣接していて、sz1[0]
に '¥0'
が書き込まれているものと思われます。
マクロの方も近いうちに直します。おぅ、みんな、見捨てないで…。