comp.lang.c++.moderated で、C++ ではデフォルトでデバッグ ビルドにのみ存在するアサーションを製品コードに保持する必要があるかどうかについての議論が進行中です。
明らかに、各プロジェクトは一意であるため、ここでの私の質問は、アサーションを保持する必要があるかどうかではなく、どの場合にこれが推奨されるか、または良い考えではないかということです。
主張とは、つまり:
- false の場合、ソフトウェアのバグを明らかにする条件をテストする実行時チェック。
- プログラムを停止するメカニズム (おそらく、最小限のクリーンアップ作業の後)。
必ずしも C や C++ について話しているわけではありません。
私自身の意見では、あなたがプログラマーであるが、データを所有していない場合 (ほとんどの商用デスクトップ アプリケーションがそうです)、アサーションの失敗はバグを示しているため、データを保持する必要があります。バグがあり、ユーザーのデータが破損するリスクがあります。これにより、出荷前に強力なテストを行う必要があり、バグがより目立ち、発見と修正が容易になります。
あなたの意見/経験は何ですか?
乾杯、
カール
関連する質問はこちら
応答と更新
グラハムさん、
アサーションはエラーであり、純粋で単純であるため、アサーションのように処理する必要があります。エラーはリリース モードで処理する必要があるため、実際にはアサーションは必要ありません。
そのため、アサーションについて話すときは「バグ」という言葉を好みます。それは物事をより明確にします。私にとって、「エラー」という言葉は漠然としすぎています。見つからないファイルはバグではなくエラーであり、プログラムで対処する必要があります。null ポインターを逆参照しようとするのはバグであり、プログラムは何か悪いチーズのようなにおいがすることを認識する必要があります。
したがって、ポインターはアサーションでテストする必要がありますが、ファイルの存在は通常のエラー処理コードでテストする必要があります。
少し話が逸れますが、議論の重要なポイントです。
注意点として、アサーションが失敗したときにアサーションがデバッガーに割り込む場合は、そうではありません。しかし、コードの完全な制御外にあるファイルが存在できない理由はたくさんあります: 読み取り/書き込み権限、ディスクがいっぱい、USB デバイスが取り外されているなど。制御できないため、アサーションはそれに対処する正しい方法ではありません。
カール
トーマス、
はい、私は Code Complete を持っていますが、その特定のアドバイスには強く反対します。
カスタム メモリ アロケータが台無しになり、他のオブジェクトがまだ使用しているメモリのチャンクをゼロにしたとします。このオブジェクトが定期的に逆参照するポインターをたまたまゼロにします。不変条件の 1 つは、このポインターが決して null にならないことです。その状態を維持するためのいくつかのアサーションがあります。ポインタが突然 null になったらどうしますか。それが機能することを期待して、それを if() するだけですか?
ここでは製品コードについて話しているので、デバッガーに侵入してローカル状態を検査する必要はありません。これは、ユーザーのマシンの実際のバグです。
カール