C/C++ 入門

ホーム > 標準 C ライブラリ > リリース版で assert を無効にする方法

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

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

/* もっとも、「デバッグ作業」が完了しても、完全にバグが除去されるわけではありませんが・・・ */

ここでは Microsoft の C/C++ コンパイラで、ビルド方法 (条件) によって assert を無効にする方法を紹介します。

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

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

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

尚、環境は MS の Visual C++ を使っています。他の環境についてはまた別途書きたいと思います。

具体例 ~ NDEBUG を定義する

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

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

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

void main() {
	foo( 10 );
	foo( -5 );
}

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

> assert1
10
Assertion failed: i > 0, file assert1.c, line 5

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

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

コンパイラオプションとして NDEBUG を定義するには、/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 ← assert failed ではなく実行されている!

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

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

ホーム > 標準 C ライブラリ > リリース版で assert を無効にする方法