 基于静态分析的Rust内存安全缺陷检测研究基于静态分析的Rust内存安全缺陷检测研究 报告人:徐辉 报告日期:2022.11.25 复旦大学 大纲 一、问题背景 二、Rust指针缺陷检测方法 三、实验结论 四、论文发表心得 大纲 一、问题背景 二、Rust指针缺陷检测方法 三、实验结论 四、论文发表心得 Rust语言 ❑ 系统级安全编程语言 ▪ 内存安全 ▪ 并发安全 ▪ 效率 2006年 2011年 Foundation成立 2020年 2021年 Mozilla裁员Servo团队 AWS, Huawei, Google, Microsoft, Mozilla… Rust如何保障内存安全? ❑ 内存安全问题产生的主要原因之一是指针别名导致悬空指针 ▪ 手动释放内存或调用析构函数 ▪ 函数返回时发生的自动析构或内存释放 ❑ Rust设计的目标之一是编译时检查指针别名(共享可变引用) ▪ 0x012345usize; let r = address as *const i32; } unsafe { risky(); } 调用unsafe函数 定义unsafe函数 Rust的安全哲学 ❑ Safe API无论如何被使用都不应带来未定义行为 ❑ 程序员应避免直接使用unsafe code ❑ Interior unsafe:将unsafe code封装为safe API0 码力 | 28 页 | 1.55 MB | 1 年前3 基于静态分析的Rust内存安全缺陷检测研究基于静态分析的Rust内存安全缺陷检测研究 报告人:徐辉 报告日期:2022.11.25 复旦大学 大纲 一、问题背景 二、Rust指针缺陷检测方法 三、实验结论 四、论文发表心得 大纲 一、问题背景 二、Rust指针缺陷检测方法 三、实验结论 四、论文发表心得 Rust语言 ❑ 系统级安全编程语言 ▪ 内存安全 ▪ 并发安全 ▪ 效率 2006年 2011年 Foundation成立 2020年 2021年 Mozilla裁员Servo团队 AWS, Huawei, Google, Microsoft, Mozilla… Rust如何保障内存安全? ❑ 内存安全问题产生的主要原因之一是指针别名导致悬空指针 ▪ 手动释放内存或调用析构函数 ▪ 函数返回时发生的自动析构或内存释放 ❑ Rust设计的目标之一是编译时检查指针别名(共享可变引用) ▪ 0x012345usize; let r = address as *const i32; } unsafe { risky(); } 调用unsafe函数 定义unsafe函数 Rust的安全哲学 ❑ Safe API无论如何被使用都不应带来未定义行为 ❑ 程序员应避免直接使用unsafe code ❑ Interior unsafe:将unsafe code封装为safe API0 码力 | 28 页 | 1.55 MB | 1 年前3
 Borsh 安全高效的二进制序列化第三届中国 Rust 开发者大会 安全高效的二进制序列化 Daniel Wang @ NEAR Borsh • 运行、编码效率 • 确定性 • 跨平台兼容性 二进制序列化的问题 Binary Object Representation Serializer for Hashing • 字节级别确定性 • 执行速度快 Borsh • 轻量级 • 每一个对象与其二进制表示之间都存在一个双射映射0 码力 | 21 页 | 3.35 MB | 1 年前3 Borsh 安全高效的二进制序列化第三届中国 Rust 开发者大会 安全高效的二进制序列化 Daniel Wang @ NEAR Borsh • 运行、编码效率 • 确定性 • 跨平台兼容性 二进制序列化的问题 Binary Object Representation Serializer for Hashing • 字节级别确定性 • 执行速度快 Borsh • 轻量级 • 每一个对象与其二进制表示之间都存在一个双射映射0 码力 | 21 页 | 3.35 MB | 1 年前3
 Hello 算法 1.1.0 Rust版出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量: 给定一个函数,我们可以用上述技巧来统计操作数量: fn algorithm(n: i32) { let mut a = 1; // +0(技巧 1) a = a + n; // +0(技巧 1) // +n(技巧 2) for i in 0..(5 * n + 1) { 第 2 章 复杂度分析 hello‑algo.com 32 println!("{}", 0); } // +n*n(技巧 3) for i in 0..(2 * n) { for j in 0..(n + 1) { println!("{}", 0); } } } 以下公式展示了使用上述技巧前后的统计结果,两者推算出的时间复杂度都为 ?(?2) 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懒统计0 码力 | 388 页 | 18.50 MB | 1 年前3 Hello 算法 1.1.0 Rust版出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量: 给定一个函数,我们可以用上述技巧来统计操作数量: fn algorithm(n: i32) { let mut a = 1; // +0(技巧 1) a = a + n; // +0(技巧 1) // +n(技巧 2) for i in 0..(5 * n + 1) { 第 2 章 复杂度分析 hello‑algo.com 32 println!("{}", 0); } // +n*n(技巧 3) for i in 0..(2 * n) { for j in 0..(n + 1) { println!("{}", 0); } } } 以下公式展示了使用上述技巧前后的统计结果,两者推算出的时间复杂度都为 ?(?2) 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懒统计0 码力 | 388 页 | 18.50 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 Rust 版出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量: 给定一个函数,我们可以用上述技巧来统计操作数量: fn algorithm(n: i32) { let mut a = 1; // +0(技巧 1) a = a + n; // +0(技巧 1) // +n(技巧 2) for i in 0..(5 * n + 1) { 第 2 章 复杂度分析 www.hello‑algo.com 32 println!("{}", 0); } // +n*n(技巧 +n*n(技巧 3) for i in 0..(2 * n) { for j in 0..(n + 1) { println!("{}", 0); } } } 以下公式展示了使用上述技巧前后的统计结果,两者推算出的时间复杂度都为 ?(?2) 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?20 码力 | 387 页 | 18.51 MB | 10 月前3 Hello 算法 1.2.0 简体中文 Rust 版出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量: 给定一个函数,我们可以用上述技巧来统计操作数量: fn algorithm(n: i32) { let mut a = 1; // +0(技巧 1) a = a + n; // +0(技巧 1) // +n(技巧 2) for i in 0..(5 * n + 1) { 第 2 章 复杂度分析 www.hello‑algo.com 32 println!("{}", 0); } // +n*n(技巧 +n*n(技巧 3) for i in 0..(2 * n) { for j in 0..(n + 1) { println!("{}", 0); } } } 以下公式展示了使用上述技巧前后的统计结果,两者推算出的时间复杂度都为 ?(?2) 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?20 码力 | 387 页 | 18.51 MB | 10 月前3
 Hello 算法 1.0.0 Rust版出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量: 给定一个函数,我们可以用上述技巧来统计操作数量: fn algorithm(n: i32) { let mut a = 1; // +0(技巧 1) a = a + n; // +0(技巧 1) // +n(技巧 2) for i in 0..(5 * n + 1) { 第 2 章 复杂度分析 hello‑algo.com 32 println!("{}", 0); } // +n*n(技巧 3) for i in 0..(2 * n) { for j in 0..(n + 1) { println!("{}", 0); } } } 以下公式展示了使用上述技巧前后的统计结果,两者推算出的时间复杂度都为 ?(?2) 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懒统计0 码力 | 383 页 | 17.61 MB | 1 年前3 Hello 算法 1.0.0 Rust版出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量: 给定一个函数,我们可以用上述技巧来统计操作数量: fn algorithm(n: i32) { let mut a = 1; // +0(技巧 1) a = a + n; // +0(技巧 1) // +n(技巧 2) for i in 0..(5 * n + 1) { 第 2 章 复杂度分析 hello‑algo.com 32 println!("{}", 0); } // +n*n(技巧 3) for i in 0..(2 * n) { for j in 0..(n + 1) { println!("{}", 0); } } } 以下公式展示了使用上述技巧前后的统计结果,两者推算出的时间复杂度都为 ?(?2) 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懒统计0 码力 | 383 页 | 17.61 MB | 1 年前3
 Hello 算法 1.2.0 繁体中文 Rust 版出以下計數簡化技巧。 1. 忽略 ?(?) 中的常數項。因為它們都與 ? 無關,所以對時間複雜度不產生影響。 2. 省略所有係數。例如,迴圈 2? 次、5? + 1 次等,都可以簡化記為 ? 次,因為 ? 前面的係數對時間複 雜度沒有影響。 3. 迴圈巢狀時使用乘法。總操作數量等於外層迴圈和內層迴圈操作數量之積,每一層迴圈依然可以分別 套用第 1. 點和第 2. 點的技巧。 給定一個函式,我們可以用上述技巧來統計操作數量: 給定一個函式,我們可以用上述技巧來統計操作數量: fn algorithm(n: i32) { let mut a = 1; // +0(技巧 1) a = a + n; // +0(技巧 1) // +n(技巧 2) for i in 0..(5 * n + 1) { 第 2 章 複雜度分析 www.hello‑algo.com 32 println!("{}", 0); } // +n*n(技巧 +n*n(技巧 3) for i in 0..(2 * n) { for j in 0..(n + 1) { println!("{}", 0); } } } 以下公式展示了使用上述技巧前後的統計結果,兩者推算出的時間複雜度都為 ?(?2) 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整統計 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?20 码力 | 388 页 | 18.82 MB | 10 月前3 Hello 算法 1.2.0 繁体中文 Rust 版出以下計數簡化技巧。 1. 忽略 ?(?) 中的常數項。因為它們都與 ? 無關,所以對時間複雜度不產生影響。 2. 省略所有係數。例如,迴圈 2? 次、5? + 1 次等,都可以簡化記為 ? 次,因為 ? 前面的係數對時間複 雜度沒有影響。 3. 迴圈巢狀時使用乘法。總操作數量等於外層迴圈和內層迴圈操作數量之積,每一層迴圈依然可以分別 套用第 1. 點和第 2. 點的技巧。 給定一個函式,我們可以用上述技巧來統計操作數量: 給定一個函式,我們可以用上述技巧來統計操作數量: fn algorithm(n: i32) { let mut a = 1; // +0(技巧 1) a = a + n; // +0(技巧 1) // +n(技巧 2) for i in 0..(5 * n + 1) { 第 2 章 複雜度分析 www.hello‑algo.com 32 println!("{}", 0); } // +n*n(技巧 +n*n(技巧 3) for i in 0..(2 * n) { for j in 0..(n + 1) { println!("{}", 0); } } } 以下公式展示了使用上述技巧前後的統計結果,兩者推算出的時間複雜度都為 ?(?2) 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整統計 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?20 码力 | 388 页 | 18.82 MB | 10 月前3
 Rust 程序设计语言 简体中文版 1.85.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 20.1. 不安全 Rust . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 昭著的陷阱。即使谨慎的实践者,亦唯恐代码出现漏洞、崩溃或损坏。 Rust 破除了这些障碍:它消除了旧的陷阱,并提供了伴你一路同行的友好、精良的工具。想 要 “深入” 底层控制的程序员可以使用 Rust,无需时刻担心出现崩溃或安全漏洞,也无需因为 工具链不靠谱而被迫去了解其中的细节。更妙的是,语言设计本身会自然而然地引导你编写出 可靠的代码,并且运行速度和内存使用上都十分高效。 已经在从事编写底层代码的程序员可以使用 Rust abstractions)—— 将高级语言特性编 译成底层代码,并且与手写的代码运行速度同样快。Rust 努力确保代码又安全又快速。 这里提到的只是几个较大的受益群体,Rust 语言也希望能支持更多其他用户。总的来说, Rust 最重要的目标是消除数十年来程序员习以为常的取舍,让安全和高效、速度和易读易用 可以兼得。试试看 Rust,说不定它的选择就适合你。 本书适合哪些人 本书假设你已经有其他0 码力 | 562 页 | 3.23 MB | 25 天前3 Rust 程序设计语言 简体中文版 1.85.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 20.1. 不安全 Rust . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 昭著的陷阱。即使谨慎的实践者,亦唯恐代码出现漏洞、崩溃或损坏。 Rust 破除了这些障碍:它消除了旧的陷阱,并提供了伴你一路同行的友好、精良的工具。想 要 “深入” 底层控制的程序员可以使用 Rust,无需时刻担心出现崩溃或安全漏洞,也无需因为 工具链不靠谱而被迫去了解其中的细节。更妙的是,语言设计本身会自然而然地引导你编写出 可靠的代码,并且运行速度和内存使用上都十分高效。 已经在从事编写底层代码的程序员可以使用 Rust abstractions)—— 将高级语言特性编 译成底层代码,并且与手写的代码运行速度同样快。Rust 努力确保代码又安全又快速。 这里提到的只是几个较大的受益群体,Rust 语言也希望能支持更多其他用户。总的来说, Rust 最重要的目标是消除数十年来程序员习以为常的取舍,让安全和高效、速度和易读易用 可以兼得。试试看 Rust,说不定它的选择就适合你。 本书适合哪些人 本书假设你已经有其他0 码力 | 562 页 | 3.23 MB | 25 天前3
 Rust 语言学习笔记语言设计的看法主要是:重大创新,却又博采众长。 Rust 为了解决内存安全问题重新设计了类型系统,提出了所有权的概念,同时 为了能够解决当前大多数语言无法检测到的运行时错误,rust 创造性地设计了 无畏并发。Rust 借鉴了很多优秀语言的设计理念,以及快速迭代的社区,这些 都是 Rust 受到赞赏的重要因素。 Rust 是一门系统级编程语言,被设计为保证内存和线程安全,并防止段错误。 作为系统级编程语言,它的基本理念是 可以被归为通用的、多范式、编译型的编程语言,类似 C 或者 C++。与 这两门编程语言不同的是,Rust 是线程安全的! Rust 编程语言的目标是,创建一个高度安全和并发的软件系统。它强调安全性、 并发和内存控制。尽管 Rust 借用了 C 和 C++ 的语法,它不允许空指针和悬 挂指针,二者是 C 和 C++ 中系统崩溃、内存泄露和不安全代码的根源。 Rust 中有诸如 if else 和循环语句 for 和 while (structured type)而不是类(class)。这点,与基于继承的 OO 语言 C++, Java 有相当大的差异。而跟 Ocaml, Haskell 这类函数式语言更加接近。 Rust 做到了内存安全而无需 .NET 和 Java 编程语言中实现自动垃圾收集器的 开销,这是通过所有权/借用机制、生命周期、以及类型系统来达到的。 Rust 程序设计语言的本质在于赋能(empowerment):无论你现在编写的是何0 码力 | 117 页 | 2.24 MB | 1 年前3 Rust 语言学习笔记语言设计的看法主要是:重大创新,却又博采众长。 Rust 为了解决内存安全问题重新设计了类型系统,提出了所有权的概念,同时 为了能够解决当前大多数语言无法检测到的运行时错误,rust 创造性地设计了 无畏并发。Rust 借鉴了很多优秀语言的设计理念,以及快速迭代的社区,这些 都是 Rust 受到赞赏的重要因素。 Rust 是一门系统级编程语言,被设计为保证内存和线程安全,并防止段错误。 作为系统级编程语言,它的基本理念是 可以被归为通用的、多范式、编译型的编程语言,类似 C 或者 C++。与 这两门编程语言不同的是,Rust 是线程安全的! Rust 编程语言的目标是,创建一个高度安全和并发的软件系统。它强调安全性、 并发和内存控制。尽管 Rust 借用了 C 和 C++ 的语法,它不允许空指针和悬 挂指针,二者是 C 和 C++ 中系统崩溃、内存泄露和不安全代码的根源。 Rust 中有诸如 if else 和循环语句 for 和 while (structured type)而不是类(class)。这点,与基于继承的 OO 语言 C++, Java 有相当大的差异。而跟 Ocaml, Haskell 这类函数式语言更加接近。 Rust 做到了内存安全而无需 .NET 和 Java 编程语言中实现自动垃圾收集器的 开销,这是通过所有权/借用机制、生命周期、以及类型系统来达到的。 Rust 程序设计语言的本质在于赋能(empowerment):无论你现在编写的是何0 码力 | 117 页 | 2.24 MB | 1 年前3
 Rust 程序设计语言简体中文版...................................................................................... 484 19.1. 不安全的 Rust ............................................................................................ 昭著的陷阱。即使谨慎的实践者,亦唯恐代码出现漏洞、崩溃或损坏。 Rust 破除了这些障碍:它消除了旧的陷阱,并提供了伴你一路同行的友好、精良的工具。想 要 “深入” 底层控制的程序员可以使用 Rust,无需时刻担心出现崩溃或安全漏洞,也无需因为 工具链不靠谱而被迫去了解其中的细节。更妙的是,语言设计本身会自然而然地引导你编写出 可靠的代码,并且运行速度和内存使用上都十分高效。 已经在从事编写底层代码的程序员可以使用 Rust abstractions)—— 将高级语言特性编 译成底层代码,并且与手写的代码运行速度同样快。Rust 努力确保代码又安全又快速。 这里提到的只是几个较大的受益群体,Rust 语言也希望能支持更多其他用户。总的来说, Rust 最重要的目标是消除数十年来程序员习以为常的取舍,让安全和高效、速度和易读易用 可以兼得。试试看 Rust,说不定它的选择就适合你。 本书适合哪些人 本书假设你已经有其他编0 码力 | 600 页 | 12.99 MB | 1 年前3 Rust 程序设计语言简体中文版...................................................................................... 484 19.1. 不安全的 Rust ............................................................................................ 昭著的陷阱。即使谨慎的实践者,亦唯恐代码出现漏洞、崩溃或损坏。 Rust 破除了这些障碍:它消除了旧的陷阱,并提供了伴你一路同行的友好、精良的工具。想 要 “深入” 底层控制的程序员可以使用 Rust,无需时刻担心出现崩溃或安全漏洞,也无需因为 工具链不靠谱而被迫去了解其中的细节。更妙的是,语言设计本身会自然而然地引导你编写出 可靠的代码,并且运行速度和内存使用上都十分高效。 已经在从事编写底层代码的程序员可以使用 Rust abstractions)—— 将高级语言特性编 译成底层代码,并且与手写的代码运行速度同样快。Rust 努力确保代码又安全又快速。 这里提到的只是几个较大的受益群体,Rust 语言也希望能支持更多其他用户。总的来说, Rust 最重要的目标是消除数十年来程序员习以为常的取舍,让安全和高效、速度和易读易用 可以兼得。试试看 Rust,说不定它的选择就适合你。 本书适合哪些人 本书假设你已经有其他编0 码力 | 600 页 | 12.99 MB | 1 年前3
 Comprehensive Rust(简体中文) 20241229.6.1 解答 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 30 不安全 Rust 174 30.1 不安全 Rust . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 30.2 解引用裸指针 177 30.6 实现 Unsafe Trait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 30.7 安全 FFI 封装容器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 30.7.1 解答 . . . . minutes • Day 4 Afternoon (2 hours and 10 minutes, including breaks) Segment Duration 错误处理 55 minutes 不安全 Rust 1 hour and 5 minutes 深入探究 除了为期四天的“Rust 基础”课程外,还有一些专业课题提供: Android 中的 Rust 深入探究 Android 中的0 码力 | 359 页 | 1.33 MB | 10 月前3 Comprehensive Rust(简体中文) 20241229.6.1 解答 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 30 不安全 Rust 174 30.1 不安全 Rust . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 30.2 解引用裸指针 177 30.6 实现 Unsafe Trait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 30.7 安全 FFI 封装容器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 30.7.1 解答 . . . . minutes • Day 4 Afternoon (2 hours and 10 minutes, including breaks) Segment Duration 错误处理 55 minutes 不安全 Rust 1 hour and 5 minutes 深入探究 除了为期四天的“Rust 基础”课程外,还有一些专业课题提供: Android 中的 Rust 深入探究 Android 中的0 码力 | 359 页 | 1.33 MB | 10 月前3
共 38 条
- 1
- 2
- 3
- 4













