最小限の使い方
それぞれのC/C++ソースで denullpo.h をインクルードする。ただし、何も設定していない場合は、全ての機能が無効になる。
設定は全て denullpo.h をインクルードする前に所定の定数を定義することで反映される。
- DENULLPO_TRAP
- これが定義されていれば、エラー検出コールバックが有効となる。
- DENULLPO_SKIP
- これが定義されていれば、エラー検出を行う。
- DENULLPO_TRAP も DENULLPO_SKIP も定義されていなければ、エラー検出を行わない。
- DENULLPO_4CC
- インスタンスが有効であることを示す値。
- 定義されていなくても、自動的に一定値が定義される。
ポインタのチェックを行うべき箇所で、 
denullpo() にポインタを渡す。
このとき、ポインタがNULLであれば、Denullpoは設定されたエラー処理を行う。
Sample Code
/*=== denullpo()でNULLポインタへのアクセスを回避する ===*/
#include <stdio.h>
/*=== denullpo()をインクルードする前に設定する必要がある ===*/
/*=== この行をコメント化すると、Denullpoの処理を除去できる ===*/
#define DENULLPO_SKIP
#include "denullpo.h"
int main(int argc,char *argv[]){
void* p=NULL;
int err=0;
p=malloc(128);
/*=== ポインタのチェック結果で処理を分ける ===*/
if(denullpo(p)){
	/*=== 異常時の処理 ===*/
	fprintf(stderr,"this is nullpo\n");
	err=1;
	}
else{
	/*=== 正常時の処理 ===*/
	//	:
	//	:
	//	:
	free(p);
	p=NULL;
	}
return err;
}
 
インスタンスの有効性調査
Denullpoは、クラスや構造体にマジックコード用のメンバを付け加えることでインスタンスの有効性を調べることができる。
チェック対象のクラスや構造体には、 DENULLPO_INITCHECKER でマジックコードの書き込み先を定義する。
インスタンスを生成したとき、 
denullpo_setinit() を呼んでインスタンスが有効になったことを示す。
そしてインスタンスを破棄するとき、 
denullpo_setpurge() を呼んでインスタンスが無効になったことを示す。
ポインタのチェックを行うべき箇所で、 
denullpo2() にポインタを渡す。
このとき、ポインタが不正であれば、Denullpoは設定されたエラー処理を行う。
Sample Code
/*=== 不正なインスタンスのメソッド呼び出しを阻止する ===*/
#include <stdio.h>
#define DENULLPO_SKIP
#include "denullpo.h"
class FOO{
	public:
	/*=== クラスにマジックコード書き込み場所を確保する ===*/
	DENULLPO_INITCHECKER;
	FOO(){
	/*=== 初期化したことを示すマジックコードを書き込む ===*/
	denullpo_setinit(this);
	}
	~FOO(){
	/*=== 終了したことを示すマジックコードを書き込む ===*/
	denullpo_setpurge(this);
	}
	void exec(){
	/*=== このメソッドがdenullpo_setinit()とdenullpo_setpurge()の間以外から呼ばれたらエラーとして扱う ===*/
	if(denullpo2())return;
	//	:
	//	:
	//	:
	}
};
 
エラー検知コールバック
通常、
denullpo()や
denullpo2()は、エラーを検出したときすぐに結果を返す。
denullpo_settrap()によりコールバックが設定されている場合、エラーを検出したときに呼び出され、その結果が反映される。
コールバックを有効とするには、denullpo.hをインクルードする前に
DENULLPO_TRAPを定義しなければならない。
Sample Code
/*=== 不正なポインタのエラー処理を独自に実装する ===*/
#include <stdio.h>
/*=== コールバックを有効にするための設定 ===*/
#define DENULLPO_TRAP
#include "denullpo.h"
int err=0;
/*=== エラー検出時の処理 ===*/
static unsigned __cdecl hook(void *p,eDenullpoReason reason){
fprintf(stderr,"nullpo is hooked\n");
err=1;
/*=== ここの返値が、そのままdenullpo()の返値となる。 ===*/
return 1;
}
int main(int argc,char *argv[]){
void* p=NULL;
/*=== コールバックの設定 ===*/
denullpo_settrap(hook);
p=malloc(128);
/*=== ポインタがNULLなら、設定されたコールバックを実行 ===*/
if(!denullpo(p)){
	/*=== 正常時の処理 ===*/
	//	:
	//	:
	//	:
	free(p);
	p=NULL;
	}
return err;
}
 
詳細
定義類
eDenullpoReason
- DENULLPO_NULL
- 調査対象のポインタがNULLであることを示す。
- DENULLPO_INVALID
- 調査対象のインスタンスが無効であることを示す。
 
コールバック型
エラー検知コールバック
引数
返値
| 0 | エラー要因は、解決された。 | 
| 1 | エラー要因は、依然として残っている。 | 
 
関数類
エラー検知コールバックの設定
引数
返値
補足
この関数は、スレッドセーフではない。
 
エラー検知コールバックを呼ぶ。
引数
返値
| 0 | エラー要因は、解決された。 | 
| 1 | エラー要因は、依然として残っている。 | 
 
unsigned denullpo_getinit(any* p)
インスタンスチェッカの値を得る
引数
返値
 
void denullpo_setinit(any* p)
インスタンスが初期化されたことをインスタンスチェッカに通知する
引数
補足
 
void denullpo_setpurge(any* p)
インスタンスが終了されたことをインスタンスチェッカに通知する
引数
補足
 
unsigned denullpo_chkinit(any* p)
インスタンスが初期化されているかを調べる
引数
返値
補足
 
int denullpo(any* p)
ポインタがNULLであるかを調べる
引数
返値
補足
 
int denullpo2(any* p)
インスタンスが異常であるかを調べる
引数
返値
補足