Undefined Behavior: What Every Programmer Should Know and Fear
2.56 MB
38 页
0 评论
语言 | 格式 | 评分 |
---|---|---|
英语 | .pdf | 3 |
摘要 | ||
文档详细讨论了程序员应了解和关注的未定义行为(Undefined Behavior, UB)。UB是指程序执行超出设计条件,导致结果不确定,并可能影响整个程序。在C++标准中,UB与未指定行为和实现定义行为有明确区别。文档指出,UB不应被低估或夸大,其危险在于整个程序的结果可能不确定。编译器在优化时会假定UB不会发生,这可能导致不可预测的行为。避免UB的方法包括使用检查工具、定义输入域和进行输入验证。同时,文档提醒不要因为UB在当前环境中可行而忽视其风险。 | ||
AI总结 | ||
《Undefined Behavior: What Every Programmer Should Know and Fear》文档内容总结:
一、Undefined Behavior(UB)概述
1. 未定义行为(UB)是指程序在违反语言标准或合同约定时的行为,标准对此不做要求。
2. UB的本质:一旦出现UB,整个程序的行为将完全未定义,可能导致不可预测的后果。
3. UB与其他行为的区分:
- **未指定行为(Unspecified Behavior)**:程序的行为在多个可能结果中选择,但结果是明确的。
- **实现定义行为(Implementation-Defined Behavior)**:行为由编译器定义且必须明确文档化。
二、UB的现象与危害
1. UB的表现:当程序接收超出合同范围的输入、未验证输入或基于不再有效的假设操作时,可能触发UB。
2. 对性能的影响:为追求性能,某些前置条件可能难以检查,导致UB的发生。
3. 真实危险:UB可能“污染”整个程序,一旦发生,程序的所有行为都无需遵循标准规范,可能导致严重后果。
4.occus聪明的UB误解:
- 不要高估UB的危险性(如认为UB会引发核导弹发射等),这会导致开发者低估UB的实际风险。
- 不要低估UB的危险性,UB的后果可能是程序完全失控。
三、UB与编译器的关系
1. 编译器的假设:编译器可能基于UB不发生的假设进行优化,如果UB发生,编译器不承担任何责任。
2. UB的污染性:一旦发生UB,整个程序的行为将完全未定义,甚至可能影响编译器的优化逻辑。
四、避免和规避UB的指导
1. 总体原则:
- 将UB视为程序违反合同的行为,应非常重视。
- 在设计程序时,明确输入的合法域并处理超出合法域的输入。
2. 具体建议:
- 使用 sanitizer 和静态分析工具检测UB。
- 避免仅依赖“当前工作”来判断程序的安全性。
- 为用户提供可选的输入验证工具。
3. UB的检测:
- UB的检测往往Difficult,某些UB可能根本不会被检测到。
- 如果UB的代码未执行,则不会导致问题。
五、结束语
1. 关键教训:
- UB的严重性不容忽视。
- 对性能的追求可能以UB为代价。
- 依赖编译器优化可能隐藏UB的风险。
- 构建强健的程序需要严格避免UB。 |
P1
P2
P3
P4
P5
P6
P7
P8
P9
P10
P11
P12
下载文档到本地,方便使用
- 可预览页数已用完,剩余
26 页请下载阅读 -
文档评分