我一直想知道這一點,甚至有必要在我自己的庫中檢查指標是否有效。我是否應該期望用戶傳遞正確的指標,因為如果他們使用庫,這是他們的作業?
例如,如果我有一個分配并回傳結構的庫
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
}
呼叫斷言是否更有意義,或者檢查結構是否有效,如果不是則回傳?我是否應該不必費心檢查指標而只是假設用戶會做正確的事情?和清理一樣
void destroysomecontext(struct some_context* ctx){
//Which is more valid?
assert(ctx);
//or
if(!ctx)
return;
//do cleanup
}
什么更合適?斷言,如果,或者兩者都不是?同樣,如果我什至撰寫一個函式來操作字串?
void dosomestringoperation(char* str){
assert(str);
//or
if(!str)
return;
}
圖書館應該做這些檢查嗎?至少在用戶模式下,我可以在內核中理解,因為每個設備都可以訪問全域記憶體并且不檢查可能會導致崩潰,但這是否意味著即使用戶模式應用程式也應該檢查安全/健全性原因?
uj5u.com熱心網友回復:
通常人們假設指標是有效的,特別是考慮到除了空指標之外,您無法判斷傳遞的指標是否真正有效(如果給您一個指向未分配記憶體或錯誤資料的指標怎么辦?)。
一個assert(即使在發布版本中也可能是活躍的)對你的呼叫者來說是一種很好的禮貌,但僅此而已;無論如何,當您嘗試取消參考它時,您可能會崩潰,所以無論如何。
但是,無論如何,如果你得到一個空指標,不要默默地回傳:你在地毯下隱藏了一個邏輯錯誤,使得你的呼叫者更難除錯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/430176.html
標籤:C
下一篇:可以在定義之前宣告主函式嗎?
