アサーション - assertマクロ

assertマクロを使うとアサーションをソースコードに挿入できます。

assert(条件)

assertマクロの条件が真であるときは、何も起こりません。条件が偽である場合は、エラーメッセージを出力し、プログラムが終了します。コアダンプ出力を有効にしている場合は、コアダンプも出力されます。ある値が、期待している値であることをチェックしたい場合に便利です。

#include <stdio.h>
#include <stdint.h>
#include <assert.h>

int main(void) {
  int32_t num = 3;
  
  // numが1より大きいことをチェック
  assert(num > 1);
  
  printf("%d\n", num);
}

出力結果です。「num」が「1」より大きいので普通に実行されます。

3

「num」を「-1」にしてみましょう。

#include <stdio.h>
#include <stdint.h>
#include <assert.h>

int main(void) {
  int32_t num = -1;
  
  // numが1より大きいことをチェック
  assert(num > 1);
  
  printf("%d\n", num);
}

gccの場合の出力結果です。

a: a.c:9: main: Assertion `num > 1' failed.
Aborted (core dumped)

lsコマンドgrepコマンドで確認すると、コアダンプも出力されています。

$ ls | grep core
core.28560

コアダンプは、プログラムのデバッグに関する情報が格納されているファイルだと考えてください。コアダンプを使ってプログラムをデバッグする方法については、別の箇所で解説します。

assertマクロを取り除く

assertマクロは、NDEBUGマクロを、コンパイル時に指定することで、取り除くことができます。デバッグするときにだけassertマクロを使い、最終的な製品の出力にはassertマクロを入れたくないという場合に便利です。

#include <stdio.h>
#include <stdint.h>
#include <assert.h>

int main(void) {
  int32_t num = -1;
  
  // numが1より大きいことをチェック
  assert(num > 1);
  
  printf("%d\n", num);
}

次のようにgccの「-D」オプションで「NDEBUGマクロ」を定義して、実行してみましょう。assertマクロの部分が実行されません。

gcc -DNDEBUG -o a a.c && ./a

関連情報