(WWDC) 理解 Undefined Behavior

本文探讨了Undefined Behavior的概念,举例说明了如除数为0、数组越界等问题,并阐述了编译器如何处理这类行为。文章指出,虽然Undefined Behavior可能导致不可预料的结果,但也有助于提高代码性能。此外,通过Static Analyzer和Runtime Sanitizers等工具,开发者可以检测并避免此类问题。在Swift中,尽管有更高的安全性,但仍需注意与C家族API交互时可能出现的Undefined Behavior。
摘要由CSDN通过智能技术生成


内容概览

  • 什么是 undefined behavior?
  • 编译器 和 undefined behavior
  • 安全性问题
  • 使用工具进行问题检测
  • Swift 更安全



什么是 undefined behavior?

本国际标准中未作任何规定的行为 —— ISO C++14 Standard

当你的代码语法正确,但是执行的行为不在语言准许的范围内,这种行为就是Undefined behavior。
比如:除数为0、数组越界、数值类型溢出、更改字符串字面量



编译器如何处理Undefined Behavior?

  • 诊断并给出 warning 或 error
  • 按照文档中的规则执行
  • 产生不可预料的结果



为什么会有Undefined Behavior?

1306450-9f165fc7c7387702.png

这其实是一个权衡的结果,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) 可以针对更复杂的情况给出详细的信息。

1306450-17c26760dc213aea.png
编译器会捕获问题并发出warning



未对齐的指针

char *serialize_misaligned(char *buffer, int a, int b) {
    *(int *)buffer = a;
    buffer += sizeof(a);
    *(int *)buffer = b;
    buffer +
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值