使 memcpy(NULL, NULL, 0) 有明确定义 | Red Hat 开发者

主要观点:

  • C 语言中的未定义行为(UB)常引发程序员热议,它对编译器优化有重要性,但易引入导致安全问题的 bug。
  • [N3322]被接受用于 C2y,将从 C 语言的一个特定角落移除 UB,如memcpy(NULL, NULL, 0)等行为变得定义明确,而memcpy(NULL, NULL, 4)等仍为未定义行为,此移除预计不影响性能且效果相反。
  • 举例说明空字符串相关操作易出现 UB,如str_eq函数在处理空字符串时会出现 UB,导致编译器优化错误,正确写法更复杂且性能降低。
  • 原提案聚焦于移除内存库调用的 UB,后发现需考虑库函数实现,如copy函数中NULL + 0为未定义行为,需定义其返回值。
  • 提案讨论时反对意见并非来自预期方向,对NULL - NULL返回 0 争议大,静态分析视角也有反对,最终投票赞成且建议追溯应用到旧标准版本。
  • 作者在 LLVM 编译器工具链中工作,因 LLVM 内部memcpy内在函数规范与 C 语义不匹配而参与,此 C 标准变更因 Rust 开发者而产生。

关键信息:

  • [N3322]用于 C2y 以移除特定 UB。
  • 多种涉及空指针的操作在 C 标准中的定义变化。
  • str_eq函数的 UB 及正确写法。
  • 编译器对相关 UB 的处理及假设。
  • 提案讨论中的反对意见及最终结果。
  • LLVM 与 C 语义不匹配及此标准变更的缘由。

重要细节:

  • N3322 文档链接
  • struct str结构体的字符串表示及相关函数示例。
  • GCC 和 Clang 对涉及空指针代码的不同处理。
  • 关于NULL - NULL返回 0 的争议及静态分析影响。
  • LLVM 中llvm.memcpy内在函数的规范及与 C 库的关系。
阅读 7
0 条评论