手动中毒的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

+0

也许其中一个运行时库在调试版本中执行此操作。但我不希望在发布版本中这样做,因为它违背了“只为你需要的东西付钱”的原则。 –

这在锵的libc中++和libstdc谷歌的分支++(已实施详情请参阅Asan wiki)。

这个功能的一个问题是它打破了单独的清理,即只清理应用程序的一部分(例如只有可执行文件而不是libs)的能力。问题在于,如果vector被unsanitized推入并弹出消毒代码,则推入者不会意识到它需要取消缓冲区。