5

在下面的代码片段中,有一个并非微不足道的错误,但我希望像 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;
}

当对向量进行范围限定并在范围之外打印时,catch 引用会抛出错误 use-heap-after-free。

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

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

4

1 回答 1

3

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

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

于 2017-04-13T10:43:28.083 回答