Linux 7.2 移除 strncpy API

Linux 7.2 已正式從核心中移除 strncpy API。這次移除標誌著為期六年的棄用過程的結束,該過程大約需要 362 個 commits 來消除核心程式碼庫中所有剩餘的該函數實例。

為什麼移除 strncpy

由於兩個主要問題,strncpy 函數被認為是 Linux 核心中持續存在錯誤和效能下降的來源:

  1. 違反直覺的語義:該函數關於 NUL 終止的行為經常被誤解,如果目標緩衝區沒有手動終止,可能會導致潛在的安全漏洞和記憶體損壞。
  2. 效能開銷:如果來源字串短於指定的長度,strncpy 會對目標緩衝區進行冗餘的零填充,從而浪費 CPU 週期。

Linux 核心中建議的替代方案

隨著 strncpy 的移除,核心開發人員必須使用更具體的函數,以清楚地定義預期的記憶體行為。現在強制要求使用以下替代方案:

  • strscpy():用於標準的 NUL 終止目標。
  • strscpy_pad():用於需要零填充的 NUL 終止目標。
  • strtomem_pad():用於非 NUL 終止的固定寬度欄位。
  • memcpy_and_pad():用於需要明確填充的有界複製。
  • memcpy():用於長度已知的記憶體複製。

實作細節

移除的最後階段包括一次合併,該合併消除了 strncpy API 本身以及該函數最後剩餘的 per-CPU 架構實作。這確保了程式碼庫中不再保留 strncpy 的任何舊版架構特定優化,從而強制統一過渡到更安全的替代方案。

Sources