Yggdrasil Seeds : 자작 소프트웨어 : Language Select : Denullpo, the pointer checker : Denullpo

Denullpo


최소한의 사용법

각각의 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
hDenullpoTrap 콜백으로 통지되는 에러 정보.
DENULLPO_NULL
조사 대상의 포인터가 NULL인 것을 나타낸다.
DENULLPO_INVALID
조사 대상의 인스턴스가 무효라는 점을 나타낸다.

콜백형

unsigned (*hDenullpoTrap)(void* p, eDenullpoReason reason)
에러 검지 콜백
denullpo_settrap()로 함수를 설정하면, 에러가 검지되었을 때에 불린다.
인수
p
조사 대상의 포인터
reason
에러 발생 근거
반환값
0
에러 요인은, 해결되었다.
1
에러 요인은, 여전히 남아 있다.

함수류

hDenullpoTrap denullpo_gettrap()
에러 검지 콜백의 취득
반환값
현재의 설정치
hDenullpoTrap denullpo_settrap(hDenullpoTrap trap)
에러 검지 콜백의 설정
인수
trap
콜백으로서 취급하는 함수
반환값
현재의 설정치
보충
이 함수는, 스렛드세이후는 아니다.
unsigned denullpo_exectrap(void* p, eDenullpoReason reason)
에러 검지 콜백을 부른다.
인수
p
조사 대상의 포인터
reason
에러 발생 근거
반환값
0
에러 요인은, 해결되었다.
1
에러 요인은, 여전히 남아 있다.
unsigned denullpo_getinit(any* p)
인스턴스 체커의 값을 얻는다
인수
p
대상 인스턴스
반환값
인스턴스 체커 현재가
void denullpo_setinit(any* p)
인스턴스가 초기화된 것을 인스턴스 체커에 통지한다
인수
p
대상 인스턴스
보충
denullpo2()의 대상이 되는 각 인스턴스에 대해, 이 매크로를 부를 필요가 있다.
void denullpo_setpurge(any* p)
인스턴스가 종료 된 것을 인스턴스 체커에 통지한다
인수
p
대상 인스턴스
보충
denullpo2()의 대상이 되는 각 인스턴스에 대해, 이 매크로를 부를 필요가 있다.
unsigned denullpo_chkinit(any* p)
인스턴스가 초기화되고 있을까를 조사한다
인수
p
대상 인스턴스
반환값
0
이상 없음
1
이상이 있다
보충
통상, 이 매크로는 직접 부르지 않는다. 인스턴스를 조사하려면, denullpo2()를 사용한다.
int denullpo(any* p)
포인터가 NULL일까를 조사한다
인수
p
대상 포인터
반환값
0
NULL는 아니다
1
NULL이다
보충
denullpo_settrap()로 콜백 함수가 설정되어 있으면, 에러 검출시에 그 함수가 불려 간다.
int denullpo2(any* p)
인스턴스가 비정상인가를 조사한다
인수
p
대상 인스턴스
반환값
0
이상 없음
1
이상이 있다
보충
denullpo_settrap()로 콜백 함수가 설정되어 있으면, 에러 검출시에 그 함수가 불려 간다.
이 함수를 취급하려면 , 적절한 위치에서denullpo_setinit()denullpo_setpurge()를 부를 필요가 있다.

향후의 예정


DSHs PHPlib v0.1.0 (C)2006-9 Denullpo Smasher Hammerson