6

重複の可能性:
C ++プログラムをクラッシュさせる最も簡単な方法は何ですか?

コードベースによく見られる構造があります。プログラムが何らかの理由で無効な状態になり、コードが意図的に間違った処理を実行して、クラッシュを強制します。通常、次のようになります。

if(<something is wrong>)
{
    int *ptr = NULL;
    *ptr = 0;
}

もちろん、これによりnull参照例外が発生し、回復不能な方法でプログラムがクラッシュします。これが本当にこれを行うための最良の方法であるかどうか疑問に思っていますか?まず第一に、それはよく読まない。コメントがないと、ここで発生するクラッシュが意図されたものであることに気付かない可能性があります。第二に、これから回復する方法はほとんどありません。例外をスローしないため、他のコードで処理することはできません。それは、バックトラックの方法なしで、プログラムを死んで殺すだけです。また、なぜここでクラッシュしなければならなかったのかについては、あまり手がかりがありません。また、たとえばアサーションとは異なり、すべてのビルドでクラッシュします。(非常に堅牢なアサーションシステムを利用できますが、このような場合に常に使用されるとは限りません。)

それは私たちが至る所で使用しているスタイルであり、私は他の誰かを説得しようとする立場にはありません。これが業界でどれほど一般的であるか興味があります。

4

3 に答える 3

4

プログラムを意図的に「クラッシュ」させることはできません。なぜなら、その定義上、クラッシュとは、プログラムが失敗し、決定論的に動作しない場合です

実行を終了する標準的な方法は、std::terminate;を使用することです。これを実現する通常の方法は、を呼び出すことstd::abortです。これにより、プロセスに対してブロックできない信号が発生し(std::terminate自動的に発生します)、多くのオペレーティングシステムでコアダンプが生成されます。

于 2012-11-21T21:26:10.153 に答える
2

例外をスローする必要があります。これは基本的に、意図的かつ制御された方法でクラッシュを引き起こします。これは、この質問の助けを借りた例です。

throw string("something_went_wrong");

さらに良いのは、エラーがキャッチまたは修正されることです。アサートも適切な選択です。

于 2012-11-21T21:24:02.313 に答える
1

これが、デバッグしていない状況でコアダンプをトリガーする方法だと思います。コアダンプは、問題を分析するのに十分な情報を提供します。「プログラマーエラー」(またはバグ)の場合、スタックの巻き戻しでは適切なコアダンプを作成できないため、これは例外をスローするよりも優れています。同様の効果は、コアダンプなどを生成する関数を以前に(std :: set_terminateで)登録したstd::terminateを呼び出すことでより洗練された方法で実現できます。詳細な説明については、この記事を参照してください。

于 2012-11-21T22:15:54.157 に答える