基于静态分析的Rust内存安全缺陷检测研究Huawei, Google, Microsoft, Mozilla… Rust如何保障内存安全? ❑ 内存安全问题产生的主要原因之一是指针别名导致悬空指针 ▪ 手动释放内存或调用析构函数 ▪ 函数返回时发生的自动析构或内存释放 ❑ Rust设计的目标之一是编译时检查指针别名(共享可变引用) ▪ 但一般意义上的指针分析是NP-hard问题 ▪ 智能指针可行,但作为运行时方案,效率低 ▪ Option>>, } 方法一:智能指针 方法二:允许使用裸指针 Unsafe Rust ❑ Unsafe Rust功能: ▪ 解引用裸指针 ▪ 调用unsafe函数 ▪ 调用FFI(其它语言接口) ❑ 使用条件:必须标注unsafe let mut num = 5; let r1 = &num as *const i32; unsafe { println let address = 0x012345usize; let r = address as *const i32; } unsafe { risky(); } 调用unsafe函数 定义unsafe函数 Rust的安全哲学 ❑ Safe API无论如何被使用都不应带来未定义行为 ❑ 程序员应避免直接使用unsafe code ❑ Interior unsafe:将unsafe code封装为safe 0 码力 | 28 页 | 1.55 MB | 1 年前3
Rust语言核心竞争力-庄晓立42 call void %9(i8* %5), !dbg !42 ret void, !dbg !44 } //trait object, fat pointer, vtalbe, 虚函数 同一个资源可能由变量A持有或变量B持有; 同一个变量可能持有资源也可能不持有资源; 同一时刻有且只有一个变量唯一持有(Owns)某个资源。 持有资源的变量超出作用域或被另赋新值时,自动调用 资源析构函数(Drop),无论该资源在堆上还是栈上。 Rust的RAII青出于蓝而胜于蓝(蓝=C++) (std::unique_ptr) Borrowing(租借使用权) Shared borrow T::new(); v.push(&t); // error: `t` does // not live long enough } 因为t将先于v被析构(这一点易被忽视) v的析构函数可能访问到无效的t引用! 此处潜在的内存“不安全”代码没能逃过borrowck的法眼。 http://is.gd/HVy7yk fn test1(s: String) {} fn0 码力 | 51 页 | 1.09 MB | 1 年前3
Rust 程序设计语言简体中文版.......................................................................................... 47 3.3. 函数 .................................................................................................. ........................... 316 13. Rust 中的函数式语言功能:迭代器与闭包 ...................................................................... 318 13.1. 闭包:可以捕获其环境的匿名函数 ........................................... ...................................................................................... 507 19.4. 高级函数与闭包 ...............................................................................................0 码力 | 600 页 | 12.99 MB | 1 年前3
Rust 程序设计语言 简体中文版 1.85.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.3. 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 13. 函数式语言特性:迭代器与闭包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 13.1. 闭包:可以捕获其环境的匿名函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 20.4. 高级函数与闭包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .0 码力 | 562 页 | 3.23 MB | 1 月前3
Comprehensive Rust(简体中文) 202412. . . . . 32 1 6.4.1 作用域和遮蔽(Shadowing). . . . . . . . . . . . . . . . . . . . . . . . . 32 6.5 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 6.6 宏 . . . . 4.1 解答 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 14 泛型 74 14.1 泛型函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 14.2 泛型类型 . . . . impl Trait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 14.6 练习:通用 min 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 14.6.1 解答 . . . . . . . . . .0 码力 | 359 页 | 1.33 MB | 11 月前3
Rust 语言学习笔记.................................................. 38 3.4.1.函数传递参数和返回参数类似于 let 语句 .................................... 38 3.4.2 涉及到函数和结构体的借用检查器 ........................................... 39 第四章 第六章 Rust 语言高级特性 ......................................................................... 61 6.1 函数式编程 ................................................................................. 61 6.1.1 闭包 ........ 61 6.1.2 闭包捕获周围环境的方式 ....................................................... 62 6.1.3 函数指针............................................................................ 64 6.2 unsafe 与原始指针0 码力 | 117 页 | 2.24 MB | 1 年前3
Rust 是否需要另⼀种“⾊彩”的 Future? - 郭⼦兴} } } 取消 Future ⽤户可以突破 async / await 封装⾃⼰的 Future 类型,被构造的 Future 类型不要求返 回完成即可被析构。 async fn task_one() { /� ��� ⁎/ } async fn task_two() { /� ��� ⁎/ } async fn 基于⽆副作⽤取消的控制流程可能会引发致命 错误。 1. 获取连结; 2. 进⼊接收循环; 3. 链接读取超时,进⼊超时分⽀; 4. 接收事件完成; 5. 离开超时分⽀; 6. 析构 t1, t2 Future; Stream::merge ⽽不是 select! ⽤户必须感知当 Future 被取消时如何进⾏清 理,因此我们尝试将 select 的所有分⽀整理 成 Stream shoud be safe } 另⼀种“⾊彩”的 Future 因此 Rust 可能需要另⼀种”颜⾊“的 Future,区别于现有 的 Future: 1. 在未返回 Poll::Ready 前析构 Future 将可能产⽣未定义 ⾏为; 2. 取消 outer Future 时不同步取消 inner Future 将可能 产⽣未定义⾏为; #[completion] async fn0 码力 | 19 页 | 7.77 MB | 1 年前3
洛佳 组件化驱动、ROM运行环境与RustSBI动、环境和SBI接口的基础上,提供快速 实现具体引导流程的解决方案。 目录 组件化驱动 第 01 部分 什么是组件化驱动? 运 用 生 命 周 期 、可 变 性 等 最 新 的 编 程 语 言 理 论 成 果 ,构 造 适 应 开 发 需 求 的 驱 动 程 序 。可 结 合 过 程 宏 等 工 程 设 计 ,提 高 开 发 效 率 。 2 1 世 纪 的 驱 动 程 序 同 系 列 芯 片 可 共 用 驱 ,同 时 运 用 于 嵌 入 式 、固 件 和 操 作 系 统 生 态 中 。 轻 松 构 造 测 试 框 架 ,快 速 验 证 组 件 。 灵 活 、 高 效 、 低 成 本 从 基 础 算 法 到 文 件 、网 络 ,操 作 系 统 的 各 个 部 分 可 拆 为 组 件 。灵 活 组 合 组 件 ,构 成 符 合 应 用 需 求 的 组 件 化 操 作 系 统 。 系 统 软 件 开 发 适配embedded-hal等外设功能标准抽象 面 向 功 能 的 外 设 结 构 联合所有权、泛型等,暴露外设所有功能 外 设 及 其 寄 存 器 表 示 封装寄存器、位域表示和数据结构 分享性外设:以GPIO为例 • 从前级环境获取所有权,如从ROM 运行环境的#[entry]获得; • 配置GPIO状态后,只有对应外设类 型允许的操作函数能通过编译,否则 拒绝编译,避免不安全行为; • 开源标准抽象的功能,使用抽象规定0 码力 | 21 页 | 3.12 MB | 1 年前3
Hello 算法 1.1.0 Rust版本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 第 0 章 前言 hello‑algo.com 5 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,更易于理解。在本书中,重点和难点知识将主 ,每一轮将一张扑克牌从无序部分插入至有序部分,直至所有扑克牌都有序。 图 1‑2 扑克排序步骤 上述整理扑克牌的方法本质上是“插入排序”算法,它在处理小型数据集时非常高效。许多编程语言的排序 库函数中都有插入排序的身影。 例三:货币找零。假设我们在超市购买了 69 元的商品,给了收银员 100 元,则收银员需要找我们 31 元。他 会很自然地完成如图 1‑3 所示的思考。 1. 可选项是比 某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某段 代码,直到这个条件不再满足。 1. for 循环 for 循环是最常见的迭代形式之一,适合在预先知道迭代次数时使用。 以下函数基于 for 循环实现了求和 1 + 2 + ⋯ + ? ,求和结果使用变量 res 记录。需要注意的是,Python 中 range(a, b) 对应的区间是“左闭右开”的,对应的遍历范围为 ?0 码力 | 388 页 | 18.50 MB | 1 年前3
Hello 算法 1.0.0 Rust版Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 第 0 章 前言 hello‑algo.com 5 * 注释 */ 0.2.2 在动画图解中高效学习 相较于文 ,每一轮将一张扑克牌从无序部分插入至有序部分,直至所有扑克牌都有序。 图 1‑2 扑克排序步骤 上述整理扑克牌的方法本质上是“插入排序”算法,它在处理小型数据集时非常高效。许多编程语言的排序 库函数中都有插入排序的身影。 例三:货币找零。假设我们在超市购买了 69 元的商品,给了收银员 100 元,则收银员需要找我们 31 元。他 会很自然地完成如图 1‑3 所示的思考。 1. 可选项是比 iteration」是一种重复执行某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某 段代码,直到这个条件不再满足。 1. for 循环 for 循环是最常见的迭代形式之一,适合在预先知道迭代次数时使用。 以下函数基于 for 循环实现了求和 1 + 2 + ⋯ + ? ,求和结果使用变量 res 记录。需要注意的是,Python 中 range(a, b) 对应的区间是“左闭右开”的,对应的遍历范围为 ?0 码力 | 383 页 | 17.61 MB | 1 年前3
共 31 条
- 1
- 2
- 3
- 4













