Cでアサートを使用する必要があるのはいつですか?

assert プロセスを中止しますが、プログラムが -DNDEBUG でコンパイルされると何もしません であるため、これはかなり大雑把なデバッグ ツールであり、それ以上のものではありません。 assert のみを使用してください 「あり得ない」状況をチェックします。アルゴリズムの不変条件または事後条件に違反しますが、おそらく そうではない 入力検証用(確かにライブラリにはありません)。クライアントからの無効な入力を検出した場合は、友好的にエラー コードを返します。

assert の使用例 たとえば、非常にスマートなソート アルゴリズムを実装しており、それが本当にソートされるかどうかを確認したい場合です。並べ替え関数は「正常に機能する」はずで、値を返さないため、API を変更せずにエラー リターンを追加することはできません。

void sort(int *a, size_t n)
{
    recursive_super_duper_sort(a, 0, n);
    assert(is_sorted(a, n));
}

static bool is_sorted(int const *a, size_t n)
{
    for (size_t i=0; i<n-1; i++)
        if (a[i] > a[i+1])
            return false;

    return true;
}

長い目で見れば、assert の代わりに、この種のことに対して適切な単体テスト フレームワークが本当に必要になるでしょう。 ですが、一時的なデバッグ ツールとしては便利です。


エラー コードは実行時の動作を知らせます。アサーションは、開発者が仮定をアサートできるようにするデバッグ ツールです。 プログラム ロジックについては確かに真実です。

これらは、用途が異なる 2 つの完全に異なるものです。

エラー コードは、通常のプログラム フローの一部です。アサーションはのみ アサーションがトリガーされた場合は、プログラムが正しく記述されていないことを意味します。


一般に、アサーションは、プログラマー (つまり、あなた) が実際のユーザーにプログラムをリリースする前にロジック/プログラミング エラーを見つけるためのものです。実行時入力エラーの検出にはアサートを使用しないでください。これらにはエラー コードを使用してください。