0

昨日、私は自分のプロギーで頭も尻尾もわからないバグに出くわしました。ソフトウェアを何時間も使用した後、突然クラッシュし、次のタイプのメッセージが表示されました (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 ループ内から呼び出されているためでしょうか?

だから私の質問は、これがバッファオーバーフローの最も可能性の高い原因なのか、それとも別の場所を見るべきなのかということです. この散発的で非常に厄介なエラーを引き起こす可能性のある他の問題が何であるかは本当にわかりません。

4

1 に答える 1

0

提供された例には無限ループはありません。

最初の反復前の値は次のとおりです。 bob = 0; ポップ = 0;

0 (pop) は 0 (bob) 未満ではないため、pop < bob は false を返し、for ループは実行されません。for ループが実行されている場合は、bob の値を確認します。おそらく、実行されないコード パスに bob の変数の初期化を配置しました。

個人的には、デバッガーの使用をお勧めします。

于 2012-09-19T12:18:33.510 に答える