昨日、私は自分のプロギーで頭も尻尾もわからないバグに出くわしました。ソフトウェアを何時間も使用した後、突然クラッシュし、次のタイプのメッセージが表示されました (1 回しか再現できず、メッセージを保存しなかったため、同じではない可能性があります - しかし、これは BEX エラーであり、別のメッセージを使用しました)。そのためのコード スニペットについては、以下を参照してください):
Problemsignatur:
Problemereignisname: BEX
Anwendungsname: ----.exe
Anwendungsversion: 0.0.0.0
Anwendungszeitstempel: 5059a92f
Fehlermodulname: ----.exe
Fehlermodulversion: 0.0.0.0
Fehlermodulzeitstempel: 5059a92f
Ausnahmeoffset: 0000cae3
Ausnahmecode: c0000417
Ausnahmedaten: 00000000
Betriebsystemversion: 6.0.6000.2.0.0.---.-
Gebietsschema-ID: 1031
Zusatzinformation 1: d752
Zusatzinformation 2: becd3a3c3e2751afee56698a1f79a48e
Zusatzinformation 3: 4c74
Zusatzinformation 4: 91af6395315cadbb5a06842f28b0d430
そのため、これがバッファ オーバーフロー エラーであることがわかったとき、そのバッファ オーバーフローがどこで発生するかを突き止めようとしました。動作しないはずの for ループを思いついたので、このようなエラーが発生します。問題のタイプは、次のようなものです。
int bob=0;int pop;
for(pop=0;pop<bob;pop++){cout<<pop;}
ただし、 cout の代わりに pop 値を使用して配列に要素を入力します。ここでは、デモンストレーションのためにゼロで初期化しました。プログラムでは、ユーザーが bob を値 >0 に変更できますが、bob がゼロであるか !=0 であるかに関係なく、for ループは継続的に呼び出されます。上記のコードを実行すると、proggy はすぐに (予想どおり) クラッシュしますが、実際のケースではクラッシュしませんでした。cout コマンドを使用して for ループが実際に実行されているかどうかを確認しても、しばらく経ってからです。これは、コードが関数内にあり、その関数が while ループ内から呼び出されているためでしょうか?
だから私の質問は、これがバッファオーバーフローの最も可能性の高い原因なのか、それとも別の場所を見るべきなのかということです. この散発的で非常に厄介なエラーを引き起こす可能性のある他の問題が何であるかは本当にわかりません。