C言語,assert()関数でデバッグ時の検証を行う

スポンサーリンク

鍛錬 694

C言語,assert()関数でデバッグ時の検証を行う

デバッグ時などで assert()関数を使用すると、以下について検証することができます。

  • 想定している条件に正しく合致しているのかを診断する。
  • 条件に合致していない場合は、その時点でプログラムを終了する。
  • 異常な箇所について、ファイル名や行番号と共に標準出力へ出力する。

 
以下は、assert()関数についてです。

ヘッダファイル「assert.h」がインクルードされる前に、マクロ「NDEBUG」が定義されている場合は、assert()関数は無効化されるため実行されません。

assert()関数を実行する場合

#include <assert.h>

void assert(scalar expression);
 

 
assert()関数を無効にする場合

#define NDEBUG
#include <assert.h>

void assert(scalar expression);
 

引数

以下は、上記の引数についてです。

引数 意味
scalar expression 真か偽を判定する条件

戻り値

戻り値はありません。

スポンサーリンク

プログラム

以下は、想定している条件に合致しているのかを assert()関数を用いて確認するプログラム、test_assert.c です。

今回は、関数の引数として与えられる数値が、条件に合致しているのか(0 以上であるか)について確認しています。

// include
#include <stdio.h>

// マクロ"NDEBUG"
//#define NDEBUG

#include <assert.h>

// prototype
void TestFuncAssert(int num);

// main
int main(void)
{
	int num;
	
	num = 123;
	TestFuncAssert(num);
	
	num = -456;
	TestFuncAssert(num);
	
	return 0;
}

// ===================================================
// @brief  assert()の機能を確認する
// @param  num [in],assert()で診断する際に使用する数値
// @return 無し
// @note   無し
// ===================================================
void TestFuncAssert(int num)
{
	printf("--- Start -----------------\n");
	
	// assert()で診断
	assert(num > 0);
	printf("num = %d\n", num);
	
	printf("------------------- End ---\n\n");
}
スポンサーリンク

実行結果

以下は、プログラム test_assert を実行して挙動を確認しています。

マクロ「NDEBUG」を定義する場合

以下は、前述したソースコード test_assert.c の 5 行目について、コメントアウトを外してマクロ「NDEBUG」を有効にしているため、assert()関数が実行されません。

// include
#include <stdio.h>

// マクロ"NDEBUG"
#define NDEBUG

#include <assert.h>
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra test_assert.c -o test_assert
***@ubuntu:~/***/test/c$ ./test_assert
--- Start -----------------
num = 123
------------------- End ---

--- Start -----------------
num = -456
------------------- End ---

マクロ「NDEBUG」を定義しない場合

以下は、前述したソースコード test_assert.c の 5 行目について、コメントアウトを記述してマクロ「NDEBUG」を無効にしているため、assert()関数が実行されます。

// include
#include <stdio.h>

// マクロ"NDEBUG"
//#define NDEBUG

#include <assert.h>
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra test_assert.c -o test_assert
***@ubuntu:~/***/test/c$ ./test_assert
--- Start -----------------
num = 123
------------------- End ---

--- Start -----------------
test_assert: test_assert.c:31: TestFuncAssert: Assertion `num > 0' failed.
中止 (コアダンプ)

 
上記に示した通り、以下の診断情報を取得することができました。

項目 診断情報
実行ファイル名 test_assert
ソースファイル(.c)名 test_assert.c
診断を実行した行 31行目
診断実行時に呼ばれていた関数名 TestFuncAssert
診断で使用した条件 num > 0
タイトルとURLをコピーしました