手动中毒std :: vector

时间:2017-04-13 10:00:44

标签: 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;
}

当scopping向量并在范围之外打印时,catch引用会在use-heap-after-free之后抛出错误。

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

我搜索了一下,发现你可以手动毒害内存,我想知道这是否已在STL中实现(https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning

1 个答案:

答案 0 :(得分:3)

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

此功能的一个问题是它打破了单独的清理,即仅清理应用程序部分的能力(例如,只有可执行文件而不是libs)。问题是如果向量被推入未经过清理并且在清理过的代码中弹出,则推送器将不会意识到它需要取消缓冲区。出于这个原因,默认情况下它在GCC中被禁用(定义{{​​1}}以启用它),Clang默认情况下仍然有一个不明原因。