トップ回答者
バッファ オーバーランしている原因究明の仕方について

質問
回答
-
こんにちわ。ミッヒーといいます。
本格的な確認をするのであれば、ダンプを出力して、となるのでしょうが、そこからバグを探すのも慣れが必要ですよね・・・。
ダンプ出力からのバグ探しは私も不得手なので、他の方のフォローを期待しつつ、とりあえずのアドバイス的なものを。
Release 版と Debug 版では関数呼び出し時のレジスタ値の扱いが異なります。
Debug 版では関数内部でのスタック破損への対処として、全レジスタ値がスタックに保存され、関数終了と同時にレジスタ値の復帰が行われるはずです。この処理は、安全性の為に付けられているので、当然 Release 版では存在しない命令になります。
言い換えれば、Debug 版で既にバッファオーバーランが起きているが、レジスタ保護処理が入っている為に正常動作している、という状況だと思います。
プログラム内でバッファオーバーランが発生していないかの再確認と、メモリ操作部分の再確認、ぐらいでしょうか・・・。- 回答としてマーク 高橋 春樹 2009年10月20日 9:15
すべての返信
-
こんにちわ。ミッヒーといいます。
本格的な確認をするのであれば、ダンプを出力して、となるのでしょうが、そこからバグを探すのも慣れが必要ですよね・・・。
ダンプ出力からのバグ探しは私も不得手なので、他の方のフォローを期待しつつ、とりあえずのアドバイス的なものを。
Release 版と Debug 版では関数呼び出し時のレジスタ値の扱いが異なります。
Debug 版では関数内部でのスタック破損への対処として、全レジスタ値がスタックに保存され、関数終了と同時にレジスタ値の復帰が行われるはずです。この処理は、安全性の為に付けられているので、当然 Release 版では存在しない命令になります。
言い換えれば、Debug 版で既にバッファオーバーランが起きているが、レジスタ保護処理が入っている為に正常動作している、という状況だと思います。
プログラム内でバッファオーバーランが発生していないかの再確認と、メモリ操作部分の再確認、ぐらいでしょうか・・・。- 回答としてマーク 高橋 春樹 2009年10月20日 9:15
-
こんにちは、フォーラムオペレーターの高橋春樹です。
ミッヒーさん、Atsushi777さん、いつもお世話になっております。
msdn.kikiさん、初めまして。
MSDNフォーラムのご利用ありがとうございます。すこし間があいたのですが、その後如何でしょうか?
もし良ければ、こちらのデバックツールも使ってください。
Windows 用デバッグ ツール
http://www.microsoft.com/japan/whdc/devtools/debugging/default.mspx今回ミッヒーさん、Atsushi777さんからの投稿が有用な情報だと思いましたので、
勝手ながら、回答マークを付けさせてもらいました。
問題が解決していないときは、詳しい状況を伝えて頂ければと思います。今後ともMSDNフォーラムをよろしくお願いします(^-^)
マイクロソフト株式会社 フォーラム オペレーター 高橋春樹