主要观点:
- 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 库的关系。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。