std::vector手动中毒

Manual poisoning of std::vector

在下面的代码片段中有一个不重要的错误,但我希望像 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 之后释放内存,因此引用仍然指向 valid内存。

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

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

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