Linux 7.2 移除 strncpy API

Linux 7.2 已正式从内核中移除 strncpy API。此举标志着历时六年的弃用过程结束,期间约有 362 次提交用于消除内核代码库中所有剩余的该函数实例。

为什么移除 strncpy

strncpy 函数被认定为 Linux 内核中持续产生 bug 和性能下降的根源,主要有两个问题:

  1. 语义反直觉:函数对 NUL 终止的行为常被误解,如果目标缓冲区未手动添加终止符,可能导致安全漏洞和内存损坏。
  2. 性能开销:当源字符串长度小于指定长度时,strncpy 会对目标缓冲区进行冗余的零填充,浪费 CPU 周期。

Linux 内核推荐的替代方案

随着 strncpy 的移除,内核开发者必须使用更明确内存行为的函数。现在强制使用以下替代方案:

  • strscpy():用于标准的 NUL 终止目标。
  • strscpy_pad():用于需要零填充的 NUL 终止目标。
  • strtomem_pad():用于非 NUL 终止的固定宽度字段。
  • memcpy_and_pad():用于需要显式填充的受限拷贝。
  • memcpy():用于长度已知的内存拷贝。

实现细节

移除的最后阶段包括一次合并,彻底删除了 strncpy API 本身以及该函数最后剩余的 per-CPU 架构实现。这确保代码库中不再保留任何旧的架构特定优化,实现向更安全替代方案的统一过渡。

Sources