최소한의 사용법
각각의 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
- 조사 대상의 인스턴스가 무효라는 점을 나타낸다.
콜백형
에러 검지 콜백
인수
p | 조사 대상의 포인터 |
reason | 에러 발생 근거 |
반환값
0 | 에러 요인은, 해결되었다. |
1 | 에러 요인은, 여전히 남아 있다. |
함수류
에러 검지 콜백의 설정
인수
반환값
보충
이 함수는, 스렛드세이후는 아니다.
에러 검지 콜백을 부른다.
인수
p | 조사 대상의 포인터 |
reason | 에러 발생 근거 |
반환값
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)
인스턴스가 비정상인가를 조사한다
인수
반환값
보충