std::vector手动中毒
Manual poisoning of std::vector
在下面的代码片段中有一个不重要的错误,但我希望像 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;
}
当在 vector 的范围内打印并在范围外打印 catch 引用时,会抛出 use-heap-after-free 错误。
但是当没有范围时,std::vector
实现可能不会在 pop_back 之后释放内存,因此引用仍然指向 valid内存。
我四处搜索,发现您可以手动毒化内存,我想知道这是否已在 STL 中实现 (https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning)
这已在 Clang (libc++) 和相对较新的 GNU (libstdc++) STL 中实现(有关详细信息,请参阅 Asan wiki)。
此功能的一个问题是它破坏了单独的清理,即仅清理应用程序的一部分(例如,仅可执行文件而不是库)的能力。问题是,如果 vector 在未净化的情况下被推入并在净化代码中弹出,推入者将不会意识到它需要解除缓冲区的毒害。由于这个原因,它在 GCC 中默认被禁用(定义 _GLIBCXX_SANITIZE_VECTOR
以启用它),由于不明原因,Clang 默认情况下仍然有它。
在下面的代码片段中有一个不重要的错误,但我希望像 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;
}
当在 vector 的范围内打印并在范围外打印 catch 引用时,会抛出 use-heap-after-free 错误。
但是当没有范围时,std::vector
实现可能不会在 pop_back 之后释放内存,因此引用仍然指向 valid内存。
我四处搜索,发现您可以手动毒化内存,我想知道这是否已在 STL 中实现 (https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning)
这已在 Clang (libc++) 和相对较新的 GNU (libstdc++) STL 中实现(有关详细信息,请参阅 Asan wiki)。
此功能的一个问题是它破坏了单独的清理,即仅清理应用程序的一部分(例如,仅可执行文件而不是库)的能力。问题是,如果 vector 在未净化的情况下被推入并在净化代码中弹出,推入者将不会意识到它需要解除缓冲区的毒害。由于这个原因,它在 GCC 中默认被禁用(定义 _GLIBCXX_SANITIZE_VECTOR
以启用它),由于不明原因,Clang 默认情况下仍然有它。