手动中毒的std :: vector
问题描述:
在下面的代码片段中有一个不重要的错误,但我希望AddressSanitizer等工具可以捕获它。手动中毒的std :: vector
#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;
}
当拖动向量并在范围之外打印时,捕获引用会抛出一个错误,使用堆后释放。
但是当没有作用域时,std :: vector实现可能不会在pop_back之后释放内存,因此引用仍然指向有效的内存。
我四处搜寻,我发现,您可以手动毒的内存和我,如果这已经在STL库已经实现疑惑(https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning)
答
这在锵的libc中++和libstdc谷歌的分支++(已实施详情请参阅Asan wiki)。
这个功能的一个问题是它打破了单独的清理,即只清理应用程序的一部分(例如只有可执行文件而不是libs)的能力。问题在于,如果vector被unsanitized推入并弹出消毒代码,则推入者不会意识到它需要取消缓冲区。
也许其中一个运行时库在调试版本中执行此操作。但我不希望在发布版本中这样做,因为它违背了“只为你需要的东西付钱”的原则。 –