gpt4 book ai didi

gcc - GCC 的 ASAN 能否提供与 Rust 相同的内存安全性?

转载 作者:行者123 更新时间:2023-11-29 07:47:15 24 4
gpt4 key购买 nike

Rust 被称为内存安全语言,但 GCC 中有一个名为 AddressSanitizer 的安全功能(阿桑):

./configure CFLAGS="-fsanitize=address -g" CXXFLAGS="-fsanitize=address -g" LDFLAGS="-fsanitize=address"
make
make check

ASAN 能否提供与 Rust 相同的内存安全性,或者 Rust 是否有更多技巧?甚至可以比较两者吗?

免责声明:我不是程序员。

最佳答案

sanitizer

GCC 和 Clang 都有一套 sanitizer ;到目前为止,它们都是在 Clang 中开发,然后移植到 GCC,因此 Clang 拥有最先进的版本:

  • Address Sanitizer (ASan):检测越界访问、释放后使用、作用域后使用、双重释放/无效释放,并正在添加对内存泄漏的支持(预期内存开销为 3 倍),
  • Memory Sanitizer (MemSan):检测未初始化的读取(预期减速 3 倍),
  • Thread Sanitizer (TSan):检测数据竞争(预期减速 5x-15x,内存开销 5x-10x),
  • Undefined Behavior Sanitizer (UBSan):各种局部未定义行为,例如未对齐的指针、整数/ float 溢出等...(最小的减速,轻微的代码大小增加)。

还有一项工作正在进行 Type Sanitizer .


sanitizer vs Rust

不幸的是,通过 sanitizer 将 C++ 提升到 Rust 的安全级别是不可能的;即使结合所有现有的 sanitizer 仍然会留下空白,众所周知它们是不完整的。

您可以在 CppCon 2017 查看 John Regher 关于未定义行为的演讲。 , 幻灯片 can be found on github ,我们从中得到当前的覆盖范围:

enter image description here

这并没有说明 sanitizer 彼此不相容的事实。也就是说,即使您愿意接受减速(15x-45x?)和内存开销(15x-30x?)的组合,您仍然无法使 C++ 程序像 Rust 程序一样安全。


加固与调试

sanitizer 如此耗费 CPU/内存的原因是因为它们是调试工具;他们试图为开发人员提供尽可能精确的诊断,以便对调试最有用。

要在生产环境中运行代码,您需要的是强化。强化是关于以尽可能低的开销消除未定义的行为。例如,Clang 支持多种方式来强化二进制文件:

这些工具可以结合使用,对性能的影响极小 (< 1%)。不幸的是,它们覆盖的范围比 sanitizer 少得多,而且最值得注意的是,它们没有试图覆盖释放后使用/作用域后使用或数据竞争,这些都是攻击的常见目标。


结论

我看不出有任何方法可以将 C++ 提升到 Rust 所结合的安全级别,如果没有:

  • 对语言有非常严格的限制:参见 MISRA/JSF 指南,
  • 非常严重的性能损失: sanitizer 、禁用优化……
  • 对标准库和编码实践进行全面检查,其中 Core Guidelines是一个开始

另一方面,值得注意的是,Rust 本身使用了不安全代码;并且它的不安全代码也需要被审查(参见 Rust Belt project )并且会受益于所有上述 sanitizer /强化检测过程。

关于gcc - GCC 的 ASAN 能否提供与 Rust 相同的内存安全性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48893656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com