在下面的代码片段中,有一个错误不是微不足道的,但我希望像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)
答案 0 :(得分:3)
这已在Clang(libc ++)和相对较新的GNU(libstdc ++)STL中实现(有关详细信息,请参阅Asan wiki)。
此功能的一个问题是它打破了单独的清理,即仅清理应用程序部分的能力(例如,只有可执行文件而不是libs)。问题是如果向量被推入未经过清理并且在清理过的代码中弹出,则推送器将不会意识到它需要取消缓冲区。出于这个原因,默认情况下它在GCC中被禁用(定义{{1}}以启用它),Clang默认情况下仍然有一个不明原因。