文字列操作
ファイル名変更ソフトのお〜瑠璃ね〜むを作成していると、文字列操作のコードをあちこちに埋め込みます。
C言語で作成しているので、バッファオーバーランを
起こしてしまわないように気を使って作っています。
しかし、ソースコードのどこかでバッファオーバーランが発生して起動しなくなる、
といった不具合がでてしまい、ソースとにらめっこしてバグ(原因)を探してもなかなか見つからず、
これならいっそ作り直した方が早いと感じてソースを途中で破棄するといったことが、
時々発生している次第です。結構大変です。
お〜瑠璃ね〜むにおいては、文字列操作の関数の中でも一番多く使っているのが "sprintf関数" です。
ではどれだけ多く使用されているのかを他の文字列関数と比較してみます。
関数名 | 使用個数 |
sprintf | 267 |
strlen | 90 |
strstr | 55 |
_mbsstr | 22 |
strcat | 18 |
他 _mbscmpなど | 10以下 |
ダントツで sprintf で使われていることが分かるでしょう。
「267個も使われていたら、そのうち3つか4つは問題を引き起こすバグが含まれていてもおかしくないかも」と
ユーザーに思っていただけるとありがないなぁ、、なんて冗談で考えていたら、
本当にバグが含まれていていました。すいませんです。
バグが含まれていたのは、なんと、お〜瑠璃ね〜むの正式な最新バージョンの 2.4です。
C言語を知っている方なら分かると思いますが、
ある2つの変数(文字列) char stringA[ ] , char stringB[ ] があって、
stringA を stringB にコピーするとき、やってはいけないことをやっちゃいました。
strcpy関数を使えば、
strcpy(stringB, stringA);
となります。
sprintf関数を使うと、本来は sprintf(stringB, "%s", stringA); となりますが、
これを sprintf(stringB, stringA); とした箇所があったために、
バグとなっていました。
どういったバグが発生するのか? 何故今まで気が付かなかったのか?
C言語をご存じなら、少し考えれば分かるかと思います。
stringAに "%" が含まれていなければ問題ないのです。しかし "%" が含まれていれば
それに続く文字と合わせて制御コードとなり、とんでもないことになるのです。
ファイル名の場合、"%" が含まれていることは少ないので、今まで気が付かなかったのですね。
なので、日時モードで区切り文字のところに、"%d" とか "%f" とかを入力するのは、絶対に
やめてください。
m(_ _)m
書いてあったらついついやりたくなるというのも無しでお願いしますよ。m(_ _)m
もちろん ver2.5ではバグを修正して公開します。
戻る