Linux 7.2 移除 strncpy API
Linux 7.2 已正式從核心中移除 strncpy API。這次移除標誌著為期六年的棄用過程的結束,該過程大約需要 362 個 commits 來消除核心程式碼庫中所有剩餘的該函數實例。
為什麼移除 strncpy
由於兩個主要問題,strncpy 函數被認為是 Linux 核心中持續存在錯誤和效能下降的來源:
- 違反直覺的語義:該函數關於 NUL 終止的行為經常被誤解,如果目標緩衝區沒有手動終止,可能會導致潛在的安全漏洞和記憶體損壞。
- 效能開銷:如果來源字串短於指定的長度,
strncpy會對目標緩衝區進行冗餘的零填充,從而浪費 CPU 週期。
Linux 核心中建議的替代方案
隨著 strncpy 的移除,核心開發人員必須使用更具體的函數,以清楚地定義預期的記憶體行為。現在強制要求使用以下替代方案:
strscpy():用於標準的 NUL 終止目標。strscpy_pad():用於需要零填充的 NUL 終止目標。strtomem_pad():用於非 NUL 終止的固定寬度欄位。memcpy_and_pad():用於需要明確填充的有界複製。memcpy():用於長度已知的記憶體複製。
實作細節
移除的最後階段包括一次合併,該合併消除了 strncpy API 本身以及該函數最後剩餘的 per-CPU 架構實作。這確保了程式碼庫中不再保留 strncpy 的任何舊版架構特定優化,從而強制統一過渡到更安全的替代方案。