以下のようなマクロを書いてみた。stdarg を使っていて、かなりその辺りに脆弱の匂いを
ぷんぷんと感じるけど、割と便利に使えている気がする。
ヘッダファイル
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
extern void *_constructor(size_t, void *, ...);
extern void _destructor(void *, void *);
#define constructor(prefix, ...) \
_constructor(sizeof(struct prefix), __##prefix##_constructor, ##__VA_ARGS__)
#define destructor(prefix, x) \
_destructor((x), __##prefix##_destructor)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
実装ファイル
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
void *
_constructor (size_t size, void *constructor, ...)
{
int ret;
va_list argp;
void *ptr;
int (* func)(void *, ...) = constructor;
ptr = NULL;
ptr = malloc(size);
if ( NULL == ptr )
return NULL;
memset(ptr, 0, size);
va_start(argp, constructor);
ret = func(ptr, argp);
va_end(argp);
if ( 1 != ret )
{
fprintf(stderr, "constructor failed\n");
free(ptr);
return NULL;
}
return ptr;
}
void
_destructor(void *ptr, void *destructor)
{
void (* func)(void *) = destructor;
if ( NULL == ptr )
return;
func(ptr);
free(ptr);
}
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
呼び出し側
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
struct hoge {
int x;
};
int __hoge_constructor(struct hoge *hoge, va_list argp)
{
hoge->x = va_arg(int, argp);
return 1;
}
void __hoge_destructor(struct hoge *hoge)
{
return;
}
struct hoge *hoge = construct(hoge, x);
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
0 件のコメント:
コメントを投稿