【發現】我不喜歡_strlcpy
https://nrk.neocities.org/articles/not-a-fan-of-strlcpy
作者討論了 strcpy 的變體 strlcpy,并認為這個變體沒有使用的意義。
他們都是把字符串拷貝到另一個位置的函數,strcpy 因為不限制目標位置的長度,容易產生緩沖區溢出,因此被很多人認為是不安全的。strlcpy 則改進了這種行為,通過傳入目標位置字符串的長度來限制緩沖區溢出。
但本文作者通過分三種情況討論,認為 strlcpy 沒有合適的應用場景。
如果使用場景允許字符串截斷,應該使用 memccpy 配合手動設置字符串尾,這比 strlcpy 更高效。
如果使用場景不允許字符串截斷,那應該使用 strdup。
如果不允許字符串截斷,但是又只能使用定長緩沖區,也應該像第一種情況一樣要使用 memccpy。而且,這比第一種情況下,strlcpy 還要低效,甚至是邏輯混亂的。
評論
從這些分析看來,strcpy 本身也是一種不合理的設計。錯誤發生時的處理,不只是錯誤處理需求本身決定的,還是產生錯誤的需求決定的。錯誤處理很大程度上是需求的一部分,而不是需求的副產物。

浙公網安備 33010602011771號