使不安全的 Rust 稍微更安全一些:使用 GWP-ASan 在生产环境中查找内存错误

主要观点:

  • Rust 是流行的系统编程语言,虽有内存安全保证,但开发者仍常通过 FFI 调用 C 和 C++,干净的 Rust 应用安全性取决于所包装的遗留代码。
  • 介绍 GWP-ASan 用于检测 C 和 C++中的内存错误,它基于 Electric Fence Malloc Debugger,结合采样方法降低开销,可在生产环境中使用,已检测出大量错误并被许多组织采用。
  • 演示如何在 C++和从 Rust 调用的 C、C++中使用 GWP-ASan 检测内存错误,包括代码示例和环境配置。
  • 提出两个开放性问题,一是 GWP-ASan 能否检测不安全的 Rust 代码中的内存错误,二是 Scudo 内存分配器对性能的影响。

关键信息:

  • GWP-ASan 基于 Electric Fence Malloc Debugger,通过插入虚拟内存页检测堆内存错误,包括缓冲区溢出和使用后释放错误。
  • GWP-ASan 结合采样方法减少开销,可通过调整采样率调整性能和内存开销,甚至可在运行时完全禁用。
  • 在 C++中使用 GWP-ASan 需用 Clang 编译并设置环境变量,在 Rust 中调用需编译 C++代码、引入 Scudo crate 并设置环境变量。
  • 开放性问题包括 GWP-ASan 对不安全 Rust 代码的检测能力以及 Scudo 内存分配器对内存优化应用性能的影响。

重要细节:

  • Electric Fence Malloc Debugger 为每个内存分配插入虚拟内存页,访问该页会导致段错误。
  • GWP-ASan 通常调用malloc,但根据采样率有时会调用 Electric Fence 保护的malloc
  • 在 C++示例中,代码存在使用后释放错误,GWP-ASan 能检测到并报告三个堆栈跟踪信息。
  • 在 Rust 中调用 C++代码时,需进行一系列编译和环境设置步骤,GWP-ASan 能检测到相同的内存错误并报告堆栈跟踪。
  • 文中提到相关的文档、视频和研究论文,如LLVM 文档Matt Morehouse 的演讲相关论文等。
阅读 18
0 条评论