内容概览
- 什么是 undefined behavior?
- 编译器 和 undefined behavior
- 安全性问题
- 使用工具进行问题检测
- Swift 更安全
什么是 undefined behavior?
本国际标准中未作任何规定的行为 —— ISO C++14 Standard
当你的代码语法正确,但是执行的行为不在语言准许的范围内,这种行为就是Undefined behavior。
比如:除数为0、数组越界、数值类型溢出、更改字符串字面量
编译器如何处理Undefined Behavior?
- 诊断并给出 warning 或 error
- 按照文档中的规则执行
- 产生不可预料的结果
为什么会有Undefined Behavior?
这其实是一个权衡的结果,C、C++、Objective-C这些语言更看重性能而不是安全。
也正因如此,我们的操作系统才能这么高效地运行。
不过,开发者需要为此付出代价。
所以,开发者需要知道这些行为并且知道如何解决他们。
Undefined Behavior 示例
使用未初始化的变量
int uninitialized_variable(int arg) {
int value;
if (arg <= 0)
value = 42;
return arg + value;
}
如果为该函数传入正数,就会导致 Undefined Behavior,因为value
未初始化就被使用。
这时候编译器会捕获问题并发出warning。静态分析器(static analyzer) 可以针对更复杂的情况给出详细的信息。
未对齐的指针
char *serialize_misaligned(char *buffer, int a, int b) {
*(int *)buffer = a;
buffer += sizeof(a);
*(int *)buffer = b;
buffer +