我已经思考了一段时间,甚至质疑在我的自己的库中检查指针是否有效是否真的有必要。如果使用库的用户没有传递正确的指针,我是否应该期望他们自己承担这个责任呢?
例如,如果我有一个分配并返回结构体的库。
struct some_context{
uintptr_t somedata;
};
struct some_context* createsomecontext(void){
return malloc(sizeof(struct some_context));
}
但是我想对那个结构进行操作
void dosomethingwithsomecontext(struct some_context* ctx){
//which is more valid here?
assert(ctx);
//or
if(!ctx)
return;
//do something with ctx
}
调用 assert 还是检查结构是否有效并在无效时返回更合理? 我是否不必担心检查指针,只需假设用户将做正确的事情? 同样的情况也适用于清理。
void destroysomecontext(struct some_context* ctx){
//Which is more valid?
assert(ctx);
//or
if(!ctx)
return;
//do cleanup
}
什么更适合?assert,if还是两者都不用?同样的,如果我要编写一个操作字符串的函数呢?
void dosomestringoperation(char* str){
assert(str);
//or
if(!str)
return;
}
库是否应该进行这些检查?至少在用户模式下,我可以理解在内核中,由于每个设备都可以访问全局内存并且可以通过不进行检查来导致崩溃,但这是否意味着即使用户模式下的应用程序也应该出于安全/健全原因进行检查?
libKayla
和libKayla_dbg
,其中“debug”版本有assert
和额外的检查。常规库“在使用意外参数调用时会引发未定义行为”。 - pmg