実行時チェックとしての表明
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/05/21 09:00 UTC 版)
「表明 (プログラミング)」の記事における「実行時チェックとしての表明」の解説
表明はプログラマが前提条件としていたことがプログラム実装中にも保持され、プログラム実行時でも正しいことを保証するのに使われる。例えば、以下のJavaコードを見てみよう: int total = countNumberOfUsers();assert(total >= 0); // total must be non-negativeif (total % 2 == 0) { // total is even} else { // total must be odd and non-negative assert(total % 2 == 1);} Javaでは % は剰余演算子である。その第一オペランドが負であった場合、演算結果も負となる。ここでプログラマは total が負でないという前提でコーディングしており、2 で割った剰余は常に 0 か 1 だと考えている。表明(assert)は、その前提条件を明確に示している。countNumberOfUsers が負数を返す可能性があるなら、これはプログラムのバグとなる可能性がある。 この技法の主な利点は、問題が発生したときにそれを即時かつ直接的に検出できる点であり、後から検出しても様々な副作用によって真の原因がなかなかつかめないことがある。表明違反はコード上の位置を表示することが多いので、煩雑なデバッグ作業なしで問題点を即座に発見することができる。 表明は決して実行されないと見なされている箇所に置かれることもある。例えば、C、C++、Javaのような言語で、switch 文の default 節に表明を置くことがある。プログラマが予期しない状態が発生した場合、実行をそのまま続けるのではなく、エラーを発生させてプログラムを停止させるのである。 Javaでは、表明はassert文としてバージョン 1.4 から言語の一部となった。表明違反は AssertionError を発生させる。 Cでは標準ヘッダファイル assert.h で assert(expression) マクロが定義されており、NDEBUGシンボルが定義されていない場合に有効になる。表明が失敗した場合、エラーメッセージを標準エラーに表示した後、abort()関数でプログラムを強制終了させることが規定されている。C++の標準では cassert というヘッダを必要とするが、ライブラリによってはC言語同様の assert.h が使用可能となっている。 表明はメモリの内容を書き換えてしまったり、スレッドの動作タイミングを変えてしまうなどの副作用を持つ危険性がある。表明はプログラム本体への副作用を生じないよう注意深く実装する必要がある。
※この「実行時チェックとしての表明」の解説は、「表明 (プログラミング)」の解説の一部です。
「実行時チェックとしての表明」を含む「表明 (プログラミング)」の記事については、「表明 (プログラミング)」の概要を参照ください。
- 実行時チェックとしての表明のページへのリンク