Linux 7.2 移除 strncpy API
Linux 7.2 已正式从内核中移除 strncpy API。此举标志着历时六年的弃用过程结束,期间约有 362 次提交用于消除内核代码库中所有剩余的该函数实例。
为什么移除 strncpy
strncpy 函数被认定为 Linux 内核中持续产生 bug 和性能下降的根源,主要有两个问题:
- 语义反直觉:函数对 NUL 终止的行为常被误解,如果目标缓冲区未手动添加终止符,可能导致安全漏洞和内存损坏。
- 性能开销:当源字符串长度小于指定长度时,
strncpy会对目标缓冲区进行冗余的零填充,浪费 CPU 周期。
Linux 内核推荐的替代方案
随着 strncpy 的移除,内核开发者必须使用更明确内存行为的函数。现在强制使用以下替代方案:
strscpy():用于标准的 NUL 终止目标。strscpy_pad():用于需要零填充的 NUL 终止目标。strtomem_pad():用于非 NUL 终止的固定宽度字段。memcpy_and_pad():用于需要显式填充的受限拷贝。memcpy():用于长度已知的内存拷贝。
实现细节
移除的最后阶段包括一次合并,彻底删除了 strncpy API 本身以及该函数最后剩余的 per-CPU 架构实现。这确保代码库中不再保留任何旧的架构特定优化,实现向更安全替代方案的统一过渡。