主要观点:
- 编程语言及其实现不同,如 Brainfuck 语言语义与实现语言(可支持函数)不同,Ruby 本身不允许直接修改任意内存地址但解释器代码有 bug 可能导致 segfault。
- 某些语言实现可扩展,如添加非移植性指令或通过 Foreign Function Interface(FFI)调用其他语言代码,可能导致 segfault,但 blame 不在原语言代码而在实现或 FFI。
- “内存安全语言”定义通常指无实现或 FFI 错误时,实际中内存安全语言因错误率低而实用,例外情况可接受且有深层原因。
- 计算机科学与数学相关,可通过证明等数学技术理解计算机和程序,如 Hoare Logic 用于推理程序状态,Separation Logic 用于推理共享可变数据结构,两者都涉及局部推理。
- 全局分析(如 Ruby 需整个代码才能确定程序是否成功)较难,局部分析(如 Rust 可仅根据函数签名确定类型)更高效且可防止局部变化影响全局,Rust 的局部推理很有用。
- RustBelt 对 Rust 进行了形式化安全证明,通过验证 typing 规则、语义正确性和库的语义满足性来确保程序安全,虽有未建模部分但已发现标准库的 soundness 错误并改进 API。
- 虽然有 RustBelt 证明和 miri 工具,但仍可能出现 undefined behavior,有人认为只需验证 unsafe 块但实际不止,且初步结果显示 Android Rust 代码无内存安全漏洞。
关键信息:
- Brainfuck 语言及解释器示例,说明语言与实现的区别。
- Ruby 中代码导致 segfault 的情况及责任归属。
- Hoare Logic 和 Separation Logic 的基本概念及作用。
- 全局分析和局部分析的对比及示例。
- RustBelt 对 Rust 安全证明的过程及成果。
- miri 工具及其使用方法。
重要细节:
- Brainfuck 有 8 个字符操作,实现可在支持函数的语言中进行。
- Ruby 程序可能因解释器 bug 而 segfault,责任在解释器代码。
- Hoare Logic 中程序状态的表示及组合规则。
- Separation Logic 的分离合取操作及帧规则。
- Rust 中
Vec<T>
实现中set_len
函数因依赖长度小于等于容量的属性而标记为 unsafe。 - RustBelt 证明的三个部分及未建模的部分。
- Google 关于 Android Rust 代码无内存安全漏洞的报告。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。