アサートは、コード実行中に不変条件をチェックするために使用されます。これらは、プログラマーが常に同じままであると想定する条件です。想定と異なる場合、コードにバグがあります。
アサートは事前条件と事後条件のチェックにも使用できます。1 つ目はコード ブロックの前にチェックされ、提供されたデータ/状態が正しいかどうかを検証し、2 つ目はいくつかの計算の結果が正しいかどうかをチェックします。これは、問題/バグがどこにあるかを絞り込むのに役立ちます:
assert( /*preconditions*/ );
/*here some algorithm - and maybe more asserts checking invariants*/
assert( /*postconditions*/ );
正当化された主張の例:
- 関数の戻り値を確認します。たとえば、外部 API 関数を呼び出して、プログラミング エラーの場合にのみエラー値が返されることがわかっている場合は、次のようにします。
WinAPI Thread32First 関数では、指定された LPTHREADENTRY32 構造体に dwSize フィールドが適切に割り当てられている必要があります。エラーが発生した場合は失敗します。この失敗は assert でキャッチする必要があります。
関数が何らかのデータへのポインターを受け入れる場合は、関数の先頭に assert を追加して、それが null でないことを確認します。この関数が null ポインターで機能しない場合、これは理にかなっています。
タイムアウトを設定してミューテックスをロックしている場合、このタイムアウトが終了すると、アサートを使用して競合状態/デッドロックの可能性を示すことができます
...そしてもっとたくさん
asserts の良いトリックは、内部にいくつかの情報を追加することです。例:
assert(false && "このアサートの理由");
「この主張の理由」がメッセージ ボックスに表示されます
また、コンパイル中のエラーを示す静的アサートもあることに注意してください。