Linux内核编程:防御性编程学习
/*
*Kernel : Linux2.6.32.63
*File : \scripts\mod\modpost.h
\scripts\mod\modpost.c
*Author : DavidLin
*Date : 2014-12-25pm
*Email : linpeng1577@163.com or linpeng1577@gmail.com
*world : the city of SZ, in China
*Ver : 000.000.001
*history : editor time do
* 1)LinPeng 2014-12-25 created this file!
* 2)
*/
/* Linux kernel code : modpost.h & modpost.c , author is someone, not me */
/* modpost.h */
#define NOFAIL(ptr) do_nofail((ptr), #ptr)
void* do_nofail (void* ptr, const char* expr);
/* end of modpost.h */
/* modpost.c */
void* do_nofail(void* ptr, const char* expr)
{
if(!ptr)
fatal("modpost: Memory allocation failure:%s.\n", expr);
return ptr;
}
static struct module* new_module(char* modname)
{
struct module* mod;
char *p, *s;
mod = NOFAIL(malloc(sizeof(*mod)));
memset(mod, 0, sizeof(*mod));
p = NOFAIL(strdup(modname));
/* strip trailing .o */
s = strrchr(p, '.');
if(s != NULL)
if(strcmp(s, ".o") == 0)
*s = '\0';
/* add to list */
mod->name = p;
mod->gpl_compatible = -1;
mod->next = modules;
modules = mod;
return mod;
}
/* end of modpost.c */
每个个体都需要重复演化,每个工程师也不例外。一般入门的时候,我们可能如下编写代码:
开始如同这步:
struct module* mod;
char *p, *s;
mod = malloc(sizeof(struct module));
memset(mod, 0, sizeof(struct module));
//未考虑mod == NULL
于是更进一步:
struct module* mod;
char *p, *s;
mod = malloc(sizeof(struct module));
if(NULL == mod) return NULL;
memset(mod, 0, sizeof(struct module));
如何再进一步?
是否每次使用malloc函数,都需要增加一句 if(NULL == ptr) return NULL;
是否可以优化? 是的,可以!
#define NOFAIL(ptr) do_nofail((ptr), #ptr)
void* do_nofail (void* ptr, const char* expr);
mod = NOFAIL(malloc(sizeof(*mod)));
memset(mod, 0, sizeof(*mod));
1. 非空封装已经封装在NOFAIL中,不仅编码工作减少,通过宏命名的自注释,
可以很清楚知道该malloc期望的是只许成功,不许失败(当然只是期待),
而且可以防止if(NULL == ptr)的偶然遗漏,更可更好的调试及维护代码;
2. 使用sizeof(*mod)代替sizeof(struct module),使得mod类型变更时,
并不会影响到具体函数,达到代码自适应效果。
3. 还可以更进一步?
可以,消化吸收,根据项目具体应用情景,具体事物具体优化。
©著作权归作者所有:来自51CTO博客作者linpeng1577的原创作品,如需转载,请注明出处,否则将追究法律责任