DOSEIの日記

技術メモ+日常ログ

assertion

プログラム中に、「ここでは必ずこうなっていなければいけない」というassertion(表明)を書いておくことで、バグを減らす。 Cには assert() マクロがあり、引数にかかれた条件が偽の場合 abort される。

assertion はプログラムロジック上ありえない状態を発見するのが目的であって、エラーチェックとは違う。例えば、引数チェックは通常 assertion の対象にはならない。error や exception は想定される状態であるからだ。逆にプログラムの実行によって想定されない状態を見つけるのが assertion である。つまり、「こういう風なプログラム」を作ったはずなのに「そうなってないじゃん」を見つけるのが assertion の仕事である。

assertion コードは通常リリースビルドでは消滅する。assertion コードにプログラムのロジックの一部を書いてはいけない。デバッグ時には現われず、リリース時にはバグになる Heisenbugs を引き起こすことになる。

このようなプログラミングパラダイムは 契約によるプログラミング (Programming by Contract) と呼ばれる。