VC++で、_tcscpy_s(dst, dstLength, src); とやったとき、デバッグビルドしたモジュールではdstの先頭からdstLengthまでしっかり「0xDF」で埋められる。
つまり、dstを確保したサイズよりも大きくdstLengthをやっちゃうと関係ないとこのメモリの内容が「0xDF」で埋められる…
みごとに重要な(でも無関係な)データをぶっ壊しており、違うとこでバグになってた。違うとこでバグってのが厄介なんだよね。
しかもリリースビルドモジュールでは問題が起こらない。リリースモジュールはうまくいくのにデバッグモジュールはダメなとき、知識として知ってないと分かりにくいバグになるんじゃないかな。
dstLengthが分かんないとき、_tcscpyで動いてるとこを適当なdstLengthを指定して_tcscpy_sに置き換えるとバグになるってことだ。
まぁdstLengthがいい加減だとセキュアの意味が全くなくなるから良いんだけど。
0 件のコメント:
コメントを投稿