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