清理你的 C++ 容器:ASan 注解的逐步步骤

主要观点:介绍 AddressSanitizer (ASan) 及其在 C++ 代码中检测内存错误的作用,包括容器溢出等,还展示了在 GCC 和 LLVM 中对 ASan 的工作,包括添加注释、各种容器的注释实现及改进等。
关键信息

  • ASan 是检测内存错误的编译器插件,可通过注释找到更多漏洞。
  • 不同 C++ 标准库对容器溢出检测支持不同,如 libstdc++、libc++、msvc++等。
  • 介绍 ASan API 用于注释内存,如ASAN_POISON_MEMORY_REGION等宏。
  • 以简单栈类为例说明添加 ASan 注释的步骤,包括创建注释包装函数等。
  • 测试注释的实践及在不同编译器下的输出。
  • 改进了 libc++中的容器注释,如向量、双端队列、字符串等的注释。
  • 还提到了 sanitize 分配器、GCC/libstdc++注释、测试注释及感谢等方面。
    重要细节
  • 在 LLVM 中,Trail of Bits 为libc++std::stringstd::deque容器添加注释,启用自定义分配器注释并修复 bug。
  • 不同容器的注释实现细节,如向量注释在 LLVM16 和 17 中的改进,双端队列注释在 LLVM16 和 17 中的实现,字符串注释在 LLVM18 和后续可能的发布等。
  • 测试注释可使用__sanitizer_verify_contiguous_container函数等,libc++库自身有扩展的容器测试。
  • 对 ASan 注释有疑问可联系 Trail of Bits 寻求帮助等。
阅读 23
0 条评论