リリース版で assert を無効にする方法

診断機能として組み込まれている assert ですが、デバッグ作業が終了した後は不要な機能、ということになります。

ここではビルドオプションでによって assert を無効にする方法を紹介します。

ビルドオプションによって診断機能を有効、無効とする

ビルドオプションによって、アサート等を含む診断機能が有効なバージョン、無効なバージョンを作りわけることができるようにしておくと、 障害発生時の原因調査が速やかに行えます。

このようなときに、ビルドオプションによって診断機能以外の箇所に影響がでないようにするなどの注意点はありますが・・・、ここでは assert に着目して、 同じコードでも、ビルドオプションによって有効、無効を切り替えることが可能であることを示します。

具体例 ~ NDEBUG を定義する

サンプルコードは 「assert - 診断機能」の説明で使った次の内容です。

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

void foo(int i) {
  assert(i > 0);
  printf("%d\n", i);
}

int main() {
  foo(10);
  foo(-5);
  return 0;
}

foo 関数への引数チェックとして assert( i > 0 ) を利用していて、以前の説明では、これを実行すると次のように、 i に -5 を渡したときに "Assertion failed" となり、プログラムがアボートすることを確認しました。

10
Assertion failed: (i > 0), function foo, file ../src/Test1.c, line 5.

この assert を無効にするにはどうしたらよいでしょうか。

assert を無効にするにはコンパイルオプションとして定数 NDEBUG を定義します。

コンパイラオプションとして NDEBUG を定義するには、Microsoft の Visual C++ コンパイラでは /D オプションを使います。つまり、次のようになります。

cl /DNDEBUG assert1.c
Microsoft (R) C/C++ Optimizing Compiler Version 
16.00.40219.01 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

assert1.c
Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:assert1.exe
assert1.obj

assert1.exe
10
-5 

上では assert1.c から assert1.exe が作られそれを実行していますが、確かに foo 関数の引数 i にマイナス値を渡しても、 assert が失敗していません。すなわち assert が有効ではありません。

また、同様に gcc の場合はコンパイル時に -DNDEBUG を定義することで、 assert を無効にすることができます。

このようにして、同じソースコードからリリース版、デバッグ版を作りわけるためには、 コンパイラオプションを変えるだけでよいようにすることができるのです。