c++ - std::vector 手动中毒

标签 c++ address-sanitizer sanitizer

在下面的代码片段中,有一个错误不是微不足道的,但我希望像 AddressSanitizer 这样的工具能够捕捉到它。

#include <vector>
#include <iostream>

int main ()
{
 std::vector<int> toto;
 toto.push_back(2);
 int const& titi = toto[0];
 toto.pop_back();
 std::cout << titi << std::endl;
 return 1;
}

当在 vector 范围内打印并在范围外打印 catch 引用时,会抛出 use-heap-after-free 错误。

但是当没有作用域时,std::vector 实现可能不会在 pop_back 之后释放内存,因此引用仍然指向有效内存。

我四处搜索,发现您可以手动毒化内存,我想知道这是否已在 STL 中实现 (https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning)

最佳答案

这已在 Clang (libc++) 和相对较新的 GNU (libstdc++) STL 中实现(有关详细信息,请参阅 Asan wiki)。

此功能的一个问题是它破坏了单独的清理,即只清理应用程序的一部分的能力(例如,只清理可执行文件而不是库)。问题是,如果 vector 在未净化的情况下被插入并在净化代码中弹出,插入者将不会意识到它需要解除缓冲区的毒害。由于这个原因,它在 GCC 中默认被禁用(定义 _GLIBCXX_SANITIZE_VECTOR 以启用它),Clang 仍然默认有它,原因不明。

关于c++ - std::vector 手动中毒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43389185/

相关文章:

c++ - 矩阵运算符重载不起作用

c++ - 如何在 C++ 中获取特定的序列

c++ - 用asan运行程序不使用rpath

gcc - 如何在 AddressSanitizer 错误时生成核心转储

c++ - Visual Studio 2013 中是否有像 Netbeans 中那样的视觉表示?

c++ - OpenGL 减慢 5k 点

c++ -/usr/bin/ld : cannot find/usr/lib64/libasan. so.0.0.0 在 redhat 上

macos - OS X 上的 Clang Address Sanitizer

gcc (4.8.3) 黑名单功能的清理选项

clang - 未定义行为 sanitizer 抑制文件 : failed to parse suppressions